Jasypt
먼저 yml 파일은 양방향 암호화가 가능해야 한다.
그 중 많이 사용하는 라이브러리인 Jasypt(Java Simplified Encryption) 를 적용해보자.
왜 ?
왜 암호화를 해야하는지 의문이 들 수 있을 것 같다.
클라우드 환경에서 RDS를 사용하고 있고 해당 정보를 yml 파일로 관리하고 있다고 가정해보자.
이 경우, 형상 관리 시에 항상 .gitignore로 설정하여 커밋하지 않거나 private 프로젝트로 진행한다면 문제가 없을 수도 있다.
하지만 public 프로젝트와 더불어 내 yml 파일을 커밋했다면 ?
나의 RDS 정보가 그대로 노출 될 수 있는 심각한 문제가 발생할 수 있다.
따라서 우리는 암호화를 진행해야 한다.
dependency 추가
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
implementation 'org.bouncycastle:bcprov-jdk15on:1.70' // AES 암호화 알고리즘을 제공해주는 라이브러리
https://liveyourit.tistory.com/196
JasyptConfig Class 생성
package com.devblog.config;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
@Configuration
@EnableEncryptableProperties
public class JasyptConfig {
@Bean("jasyptEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setProvider(new BouncyCastleProvider());
encryptor.setPoolSize(2);
encryptor.setPassword(getJasyptEncryptorPassword()); // 암호화 키
encryptor.setAlgorithm("PBEWithSHA256And128BitAES-CBC-BC"); // 알고리즘
return encryptor;
}
private String getJasyptEncryptorPassword() {
try {
ClassPathResource resource = new ClassPathResource("jasypt-encryptor-key.txt");
return String.join("", Files.readAllLines(Paths.get(resource.getURI())));
} catch (IOException e) {
throw new RuntimeException("Not found Jasypt password file.");
}
}
}
여기서 암호화 키값을 지정해줄 수 있는데,
키값을 노출하면 암호화한 의미가 없다.
키값을 다른 파일에서 관리하고 그 파일을 읽어 가져오는 형식으로 적용해야한다.
jasypt-encryptor-key.txt 생성
1. /src/main/resource에 위 파일을 생성해준다.
2. 내가 원하는 key값 입력
암호화 적용
암호화를 위해 먼저 테스트 코드를 생성해야한다.
@SpringBootTest
class JasyptConfigTest {
final BeanFactory beanFactory = new AnnotationConfigApplicationContext(JasyptConfig.class);
final StringEncryptor stringEncryptor = beanFactory.getBean("jasyptEncryptor", StringEncryptor.class);
@Test
@DisplayName("암복호화 테스트")
void encryptorTest() {
String keyword = "암호화하고 싶은 값 입력";
String enc = stringEncryptor.encrypt(keyword);
String des = stringEncryptor.decrypt(enc);
assertThat(keyword).isEqualTo(des);
}
위에 코드를 통해 암호화 한 값(enc)를 추출 후
yml에 적용해주자
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dev-blog
username: root
password: ENC(QOXXbU9F0FgXSp3MhZfaDjWdAOAZjRc0C3EeOnuo7HQ=)
# ENC() 입력 후 소괄호 안에 암호화 된 데이터를 넣어주면 된다.
스프링 실행시 정상적으로 암호화가 처리된 걸 확인할 수 있다 !
참고자료
'portfolio > 게시판 만들기' 카테고리의 다른 글
Pageable 이용한 페이징 (0) | 2023.08.13 |
---|---|
게시판 crud 작업 (0) | 2023.07.10 |
프로젝트 설계 (0) | 2023.07.09 |