[Spring] jasypt 사용하기
jasypt란
jasypt , 자시프트라고 읽는다고 한다.
jasypt 는 자바 라이브러리로 쉽게 암호화 기능을 사용할 수 있도록 한다.
DB 계정이나 중요한 키값을 평문으로 올리는 것이 아닌 암호화해서 올릴 수 있게하는 라이브러리로
스프링 프로젝트의 application.yaml 에서 중요 정보를 암호화할 때 많이 사용된다.
의존성 추가하기
mvn repository 에서 원하는 버전을 선택한다.
https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
config 파일 만들기
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableEncryptableProperties
public class JasyptConfig {
@Value("${jasypt.encryptor.password}")
private String encryptKey;
/**
* String encryptor string encryptor.
*
* @return the string encryptor
*/
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor(){
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(encryptKey);
config.setPoolSize("1");
config.setAlgorithm("PBEWithMD5AndDES");
config.setStringOutputType("base64");
config.setKeyObtentionIterations("1000");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
encryptor.setConfig(config);
return encryptor;
}
}
@Configuration 으로 빈을 등록해준다.
PBEWithMD5AndDES 암호화 알고리즘
PBE는 암호 기반 암호화 알고리즘이다.
패스워드를 기반으로 해서 만든 키로 암호화를 수행하는 방법이다.
암호화 하기
사이트를 통해 텍스트 암호화 하기
jasypt 암호화/복호화를 해주는 사이트가 있다.
plain text 에 암호화하고 싶은 텍스트 입력
two way excryption을 선택해주고
밑에 secret key를 입력해주면 된다.
yaml 에 암호화된 데이터 입력하기
암호화된 코드는 ENC()로 감싸줘야 한다.
#DB
spring:
datasource:
host: localhost:3306
database: test
username: root
password: 1234!
#DB-jasypt
spring:
datasource:
host: ENC(wbCLoCPFfAJwUZETSQrwxieCXJmoYiCF)
database: ENC(ufmx0rBJGBkqJ9CqlPYC7g==)
username: ENC(Aq4qI0FVx07nXTW3d0iZ4A==)
password: ENC(gChC+b0AJfNp/QHJGOurHw==)
Password 전달하기
암호화한 키를 스프링 내부 프로퍼티(application.yaml)에 저장하면 암호화한 의미가 없기때문에
외부 프로퍼티나 실행 인자값으로 받는다.
jar 구동
-Djasypt.encryptor.password=jasypt_password.!
-D{yaml 에 작성된 경로}={비밀번호}
war 구동
## 톰캣 실행 VM 인자값으로 사용할 때
-Djasypt.encryptor.password=jasypt_password.!
## catalina.properties를 사용할 때
톰캣 폴더/conf/catalina.properties
jasypt.encryptor.password=jasypt_password.!
Dockerfile
...
ENTRYPOINT ["java", "-Dsun.net.inetaddr.ttl=0", "-Djasypt.encryptor.password=jasypt_password.!", "-jar", "/home/app.jar"]
Intellij 에서 VM Options 적용
Edit Configuration 에서 VM options 를 추가하고
-Djasypt.encryptor.password=비밀번호 를 입력한다.
혹은
Environment variables 에 해당 정보를 추가한다
참고
https://github.com/ulisesbocchio/jasypt-spring-boot#use-you-own-custom-encryptor