프로퍼티 파일에 노출되는 중요 정보들을 암호화 해주는 라이브러리
예로 프로퍼티 파일에서 DB password 라던지 aws의 secret-key 등을 암호화 하는데 사용한다.
build.gradle
dependencies {
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3'
}
프로젝트 내부에 자바파일에다가 비밀번호를 하드코딩하게되면 암호화 한 값들이 복호화 되기 때문에 암호화 하는 의미가 없다.
따라서 환경변수에 비밀번호를 설정하고 자바로 환경변수 값을 가져온다.
변수 이름은 원하는대로 지정하고, config 파일에서 매핑만 해주면 된다.
변수 값에 비밀번호를 적어준다.
환경변수를 적용하고 인텔리제이를 재실행 해야 적용된다.
또는 컴퓨터를 재부팅 해야 한다.
JasyptConfig
@Configuration
public class JasyptConfig {
@Value("${JASYPT_PASSWORD}")
String password;
@Bean(name = "jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(password); // 암호화할 때 사용하는 키
config.setAlgorithm("PBEWithMD5AndDES"); // 암호화 알고리즘
config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
config.setPoolSize("1"); // 인스턴스 pool
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스
config.setStringOutputType("base64"); //인코딩 방식
encryptor.setConfig(config);
return encryptor;
}
}
환경변수로 등록한 비밀번호를 @Value를 이용해 값을 가져온다.
이때 @Value에 값을 환경변수 변수 이름과 매핑해준다.
JasyptConfig 클래스를 빈으로 등록해준다.
왼쪽은 암호화, 오른쪽은 복호화
첫 번째 칸에 암호화 하고자 하는 값을 입력하고
두 번째 칸에서 Two Way ... 를 선택해줘야 한다.
양방향 암호화를 선택해야 복호화가 가능하기 때문이다.
세 번째 칸에서는 키 값을 입력한다.
Encrypt 버튼을 클릭하면 맨 아래칸에 암호화 된 값이 출력된다.
application-local.yaml
cloud:
aws:
s3:
bucket: opggbucket
region:
static: ap-northeast-2
stack:
auto: false
credentials:
instance-profile: true
access-key: ENC(7sbfvXDIkJEOSR+bAeB0Q6lyhcAEd/4yOJfPpFd6oKA=)
secret-key: ENC(R7k0I+j59XctP24RUkLH/U13G3f19hTUnXyj1SOrvKTm58scftS0sW+VY51H1LGqWNUqgRDH1G8=)
jasypt:
encryptor:
bean: jasyptStringEncryptor // 빈으로 등록한 빈 이름과 매핑
리눅스 서버에 환경변수를 추가해서 적용하거나, Docker를 이용한다면 Docker Container에 환경변수를 적용할 수 있다.
docker run -d -p 8080:8080 -e [환경 변수]=[값] [docker image]:[tag]
공식 문서 참고