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