Spring Boot properties 암호화

Spring boot에서 사용하는 properties 파일의 내용을 암호화하여 사용하는 경우

해당 암호를 복호화하여 spring 상에서 사용 가능하도록 설정이 필요하다.

1
2
3
encryption:
    db:
      key: ENC(8/PndQUF80eMtQ9YiuMznw==)

상위 처럼 암호화된 값을 복화하여 사용하고 싶은 경우는

먼저 Spring boot의 main application.java 파일에 설정이 필요하다.

@EnableEncryptableProperties 어노테이션이 필요!

1
2
3
4
5
6
7
8
9
@EnableEncryptableProperties
@SpringBootApplication
public class DevEnjoyApplication {

    public static void main(String[] args) {
        SpringApplication.run(LinaBatchApplication.class, args);
    }

}

그리고 JasyptConfig.java(파일명 변경 가능) config 파일을 추가해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Configuration
public class JasyptConfig {

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        String salt = System.getProperty("jasypt.encryptor.password");

        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(salt);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.salt.NoOpIVGenerator");
        config.setStringOutputType("base64");

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(config);

        return encryptor;
    }
}

상위 코드를 추가 해준다.

String salt 값을 코드상에 박아두고 사용해도 되지만 보안을 위해서

appliation 가동시에 VM Option으로

Djasypt.encryptor.password=암호값

상위 형식으로 사용하는 방법을 추천!

이렇게 설정하고 사용하면 에러가 난다.

@DataJpaTest 시에 password 지정을 하지 않았다고 에러가 발생한다.

이유는

1
2
3
4
5
6
jasypt:
  encryptor:
    bean: jasyptStringEncryptor
    property:
      prefix: ENC(
      suffix: )

상위 처럼 bean값과 property의 prefix, suffix 설정을 해주어야 에러가 나지 않는다.

prefix, suffix 값 설정 때문에 어마무시하게 삽질을 했다.

그리고 @DataJpaTest 테스트를 진행시에는

상위 config 파일로 생성한 JasyptConfig.java을 import 해주어야 정상적으로 복호화 기능 설정이 된다.

1
2
3
4
5
6
7
8
9
10
11
@Transactional
@DataJpaTest
@ActiveProfiles("local")
@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(JasyptConfig.class) // Import
public abstract class DevEnjoyRepositoryTest<T> {
    @Autowired
    protected T repository;

}