[java] Jasypt를 이용한 자바 데이터베이스 암호화 및 복호화 전략 설정 방법

많은 애플리케이션에서는 데이터베이스에 저장되는 민감한 정보를 암호화하여 보호해야 합니다. 이를 위해 Jasypt라는 자바 라이브러리를 사용할 수 있습니다. Jasypt는 다양한 암호화 알고리즘을 지원하며, 데이터베이스 연동에서 간편하게 사용할 수 있습니다.

1. Jasypt 라이브러리 설치

Maven이나 Gradle과 같은 빌드 도구를 사용하는 경우, pom.xml 또는 build.gradle에 Jasypt 라이브러리를 추가해야 합니다. Maven에서의 예시는 아래와 같습니다:

<dependencies>
    <dependency>
        <groupId>org.jasypt</groupId>
        <artifactId>jasypt</artifactId>
        <version>1.9.3</version>
    </dependency>
</dependencies>

Gradle에서의 예시는 다음과 같습니다:

dependencies {
    implementation 'org.jasypt:jasypt:1.9.3'
}

2. 암호화 키 생성

Jasypt를 사용하여 데이터베이스 암호화를 수행하려면 암호화에 사용될 키를 생성해야 합니다. 이 키는 소스 코드에 직접 작성하지 않고, 외부 환경 변수 또는 속성 파일에서 가져오는 것이 좋습니다.

3. 데이터베이스 연동 설정

데이터베이스 연동 설정에서 Jasypt를 사용하여 암호화된 값을 저장하고 복호화할 수 있도록 구성해야 합니다. Spring Framework를 사용하는 경우, application.properties 또는 application.yml 파일에 아래와 같은 설정을 추가해야 합니다:

3.1. 암호화 설정 추가

jasypt.encryptor.password=myEncryptionKey

3.2. 암호화된 값을 사용하는 설정

spring.datasource.username=ENC(encryptedUsername)
spring.datasource.password=ENC(encryptedPassword)

위의 예제에서 myEncryptionKey는 암호화에 사용할 키이고, encryptedUsernameencryptedPassword는 Jasypt를 이용하여 암호화된 값입니다. Spring은 ENC()를 통해 자동으로 값을 복호화합니다.

4. 엔티티 속성 암호화

암호화된 데이터를 데이터베이스에 저장하려면 엔티티 클래스의 필드에 @ColumnTransformer 어노테이션을 사용하여 암호화된 값을 저장하도록 지정해야 합니다.

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username")
    @ColumnTransformer(read = "pgp_sym_decrypt(username, 'myEncryptionKey')",
                       write = "pgp_sym_encrypt(?, 'myEncryptionKey')")
    private String username;
    
    // ...
}

위의 예제에서 myEncryptionKey는 앞에서 생성한 암호화 키를 사용합니다. @ColumnTransformer 어노테이션을 통해 데이터베이스에 저장되기 전에 값을 암호화하고, 조회 시에는 값을 복호화합니다.

5. 암호화된 값 사용

데이터베이스에서 암호화된 값을 사용해야 하는 경우, 일반적인 방법으로 조회를 수행하면 Spring이 자동으로 값을 복호화하여 제공합니다. 예를 들어, Spring Data JPA를 사용하는 경우 다음과 같이 메소드를 작성할 수 있습니다:

public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.username = ?1")
    User findByUsername(String username);
    
    // ...
}

위의 예제에서는 findByUsername 메소드를 통해 암호화된 값을 사용하여 사용자를 조회하는 방법을 보여줍니다.


위의 방법을 사용하여 Jasypt를 이용한 자바 데이터베이스 암호화 전략을 설정할 수 있습니다. Jasypt의 다양한 암호화 기능을 활용하여 애플리케이션의 데이터 보안을 강화할 수 있습니다.

참고 자료: