Post
KO

jasypt (암호화) 적용 방법

github에 dev 환경에서 사용할 database 접속 정보라던지, 민감한 정보들을 암호화해서 저장하는 방법을 찾아보았다.

이때, jasypt를 이용해서 간단하게 암호화가 가능한 것으로 판단되어 적용했고, 생각보다 간단한데 개인적으로는 많이 삽을 풨던 것 같다. OTL

repository:

https://github.com/ulisesbocchio/jasypt-spring-boot

GitHub - ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot

Jasypt integration for Spring boot. Contribute to ulisesbocchio/jasypt-spring-boot development by creating an account on GitHub.

우선 spring boot에서 사용하는 방법이 2가지 정도로 나뉠 수 있을 것 같다.

첫번째로는 위 repository에 있는 내용대로 gradle에 라이브러리를 등록하고,

spring properties에 암호화 방식등을 적용해서 동작하는 방식이 있는 것 같고,

다른 방법은 configuration을 이용하여 jsypt bean을 생성하여 관리하는 방법이 있는 것 같다.

gradle 설정

com.github.ulisesbocchio jasypt-spring-boot-starter 3.0.5

bean 생성

@EnableEncryptableProperties @Configuration class Encrypt { @Bean("jasyptStringEncryptor") public StringEncryptor stringEncryptor(@Value("password") String password) { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(password); config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; } }

여기에서 password 값은 외부의 config 서버에 저장해둬야 한다.

왜냐하면 양방향 암호화 이기 때문에 password를 알고 있으면 properties에 등록한 값들을 알아낼 수 있다.

Bean 생성시 repository에 있는 것 처럼 기본 값으로 셋팅될 줄 알았는데, 아닌거 같다..

https://github.com/ulisesbocchio/jasypt-spring-boot#password-based-encryption-configuration

이런 방식으로 만든 뒤에 사용할 properties에 등록한다.

application-properties.yml

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: ENC(Vs+k4Bw48W4BwLiiurEOtRIbGjema716M1V7Lgir0EfyHP6so2iTxjF1nib723+IpMaSopQ9WFqluj6K2HKp154hEI8k/jzjXUzJbuL1wfM=) username: ENC(+P09Kb8Dj+pUA1i/HGuv8nlPhe+O+1TJ/oE43mMfnBMQWdQHNYYEHKZQuCiUvzpg) password: ENC(+P09Kb8Dj+pUA1i/HGuv8nlPhe+O+1TJ/oE43mMfnBMQWdQHNYYEHKZQuCiUvzpg)

이후 application을 구동하면 이상 없이 동작하는 것을 확인할 수 있다.

관련 task code

class EncryptTest { @Test public void ecryptTest() { val beforeData = "password" val encryptor = PooledPBEStringEncryptor() val config = SimpleStringPBEConfig() config.setPassword("password") config.algorithm = "PBEWITHHMACSHA512ANDAES_256" config.setKeyObtentionIterations("1000") config.setPoolSize("1") config.providerName = "SunJCE" config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator") config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator") config.stringOutputType = "base64" encryptor.setConfig(config) val encrypted = encryptor.encrypt(beforeData) Asserts.Equals(encryptor.decrypt(encrypted), beforeData) } }

This article is licensed under CC BY 4.0 by the author.