Java 내부의 built-in encryption API를 사용하거나 Bouncy Castle 같은 cryptographic 라이브러리 사용
컨버터 사용 시 엔티티의 데이터를 변환하여 데이터베이스에 저장이 가능.
public interface AttributeConverter<X, Y> {
public Y convertToDatabaseColumn(X attribute);
public X convertToEntityAttribute(Y dbData);
}
@Converter
public class CryptoConverter implements AttributeConverter<String, String> {
@Override
public String convertToDatabaseColumn(String plainText) {
return Optional.ofNullable(plainText)
.map(CryptoHelper::encrypt)
.orElse(null);
}
@Override
public String convertToEntityAttribute(String encrypted) {
return Optional.ofNullable(encrypted)
.map(CryptoHelper::decrypt)
.orElse(null);
}
}
@Entity
public class User {
...
@Convert(converter = CryptoConverter.class)
@Column(name = "credit_card_number")
private String creditCardNumber;
...
}
Hibernate가 제공하는 @ColumnTransfer 어노테이션 사용
@ColumnTransformer(
read = "TRIM(CHAR(0) FROM UTF8TOSTRING(DECRYPT('AES', HASH('SHA256', STRINGTOUTF8('secret-key-12345'), 1), email)))",
write = "ENCRYPT('AES', HASH('SHA256', STRINGTOUTF8('secret-key-12345'), 1), STRINGTOUTF8(?))"
)
private String email;
참고
https://sultanov.dev/blog/database-column-level-encryption-with-spring-data-jpa/
https://sungjk.github.io/2020/11/28/data-encryption-entity.html