Kim ByeungHyun
JASYPT 본문
jasypt란?
jasypt는 개발자가 암호화 작동 방식에 대한깊은 지식 없이도 최소한의 노력으로 자신의 프로젝트에
기본 암호화 기능을 추가할 수 있도록 하는 Java라이브러리입니다.
정말 간단히 라이브러리 추가,암호화,key값 넘겨주기 세가지 단계로 프로퍼티를 암호화하여 관리할수있다.
1. 라이브러르 추가 - gradle의 의존성을 추가해준다.
//githubignore jasypt
implementation group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '3.0.4'
2. 기본설정 - 나만의 Key를 사용해서 Bean을 등록하는 기본 설정이다.
https://github.com/ulisesbocchio/jasypt-spring-boot#use-you-own-custom-encryptor
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
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;
}
3. 프로퍼티 암호화
1)사이트에서 암호화
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
2)테스트코드를 이용한 암호화
@SpringBootTest
public class GodchoiceApplicationTest {
@Test
void contextLoads() {
}
@Test
void jasypt() {
// String url = "imageputbucket";
String a ="AKIAWQWYEWRCVKCZCEMO";
String b="SHDL61UN3WZDORUYsZXUoQBhJfAUMtoMA2sdG0al";
System.out.println("안뇽");
// System.out.println(jasyptEncoding(url));
System.out.println(jasyptEncoding(a));
System.out.println(jasyptEncoding(b));
}
public String jasyptEncoding(String value) {
String key = "my_jasypt_key";
StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
pbeEnc.setAlgorithm("PBEWithMD5AndDES");
pbeEnc.setPassword(key);
return pbeEnc.encrypt(value);
}
}
4. Password 전달
제일 중요한 부분이다.
Password값을 application.yml에 넣는다면 누구나 복호화할 수 있게 되므로 의미가 없어진다.
그렇기 때문에 직접 외부에서 전달해주어야 한다.
- java -jar 명령어로 어플리케이션 실행 시 전달
--jasypt.encryptor.password=testkey
java명령어를 사용해 어플리케이션을 실행하는 경우엔 맨 마지막에 -- 를 사용하여 패스워드를 전달해준다.
'--' 앞의 jasypt.encryptor.password 는 '2. 기본설정' 에서 @Value 안에 넣어준 값과 동일해야 한다.
- gradle에서 build 시 test의 프로퍼티로 전달
gradle에서 build를 진행하게되면 기본적으로 test도 같이 실행된다.
이때 암호화를 이용하여 같이 테스트를 하려 한다면 build 실행 시 Password를 함께 전달해주어야 한다.
-Pjasypt.encryptor.password=testkey
우선 build명령어 실행 시 -P를 사용하여 gradle의 환경변수로 넘겨준다.
test {
useJUnitPlatform()
systemProperty 'jasypt.encryptor.password', findProperty("jasypt.encryptor.password")
}
systemProperty는 키, 값 쌍을 인자로 테스트 수행 JVM의 시스템 프라퍼티 지정하는 메소드이다.
findProperty를 통해 '-P' 이하로 입력된 속성을 찾아서 JVM의 시스템 프로퍼티로 지정해준다.
위와 같이 사용하면 public repository에서도 application.yml을 안전하게 보관할 수 있다.