Entity 암호화 방법

Yennie·2024년 5월 14일

JPA

목록 보기
16/19

1. Spring Security 사용

2. Custom Encryption Logic

Java 내부의 built-in encryption API를 사용하거나 Bouncy Castle 같은 cryptographic 라이브러리 사용

3. JPA Attribute Converter

컨버터 사용 시 엔티티의 데이터를 변환하여 데이터베이스에 저장이 가능.

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;
    ...
}

4. 데이터베이스 수준의 암호화

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;

5. Spring AOP 또는 Custom Annotation 사용

참고
https://sultanov.dev/blog/database-column-level-encryption-with-spring-data-jpa/
https://sungjk.github.io/2020/11/28/data-encryption-entity.html

profile
PM | Aspiring SWE | linkedin.com/in/emilyyeeun

0개의 댓글