Jasypt를 이용하여 암호화에 관해 작성할 예정이다.
chatUniv프로젝트는 gpt key, jwt token, db password 등등 외부에 노출되면 안 되는 정보가 많이 담겨있다.
따라서 암호화가 반드시 필요한 상황이었다.
이를 해결하기 위해 Jasypt를 사용하였다.
Jasypt(Java Simplified Encryption)은 Java 언어로 개발된 간단한 암호화 및 복호화 기능을 제공하는 라이브러리이다.
Jasypt는 다양한 암호화 알고리즘과 기술을 지원하여 데이터 보안을 향상하는 데 도움을 준다.
- 간단한 사용법: Jasypt는 개발자가 암호화와 복호화 작업을 쉽게 수행할 수 있도록 해준다.
- 다양한 암호화 알고리즘 지원: Jasypt는 대칭키 및 비대칭키 암호화 방식을 지원하고, AES, RSA 등 다양한 알고리즘을 선택할 수 있다.
- 암호화된 설정: 소스코드나 성정 파일에 민감한 정보가 노출되지 않도록 해준다.
잘못된 yml 예시
security:
jwt:
token:
secret-key: 실제 암호 키
expire-length: 3600000
api:
gpt_key:
실제키
위의 정보를 숨기기 위해 Jasypt를 사용하였다.
build.gradle
// jasypt
implementation "com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3"
JasyptConfig
@Configuration
public class JasyptConfig {
@Value("${jasypt.encryptor.password}")
private String ENCRYPT_KEY;
@Bean(name = "jasyptEncryptor")
public StringEncryptor encrypt() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(ENCRYPT_KEY);
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations(1000);
config.setPoolSize(1);
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
암호화를 진행할 String이 위의 클래스를 사용하여 암호화가 진행된다.
config.setPassword에는 암호에 사용될 키를 넣는 값이다.
yml
jasypt:
encryptor:
bean: jasyptEncryptor
password: ${ENCRYPT_KEY}
위 코드를 yml에 추가해줘야 한다.
password를 따로 지정한 이유는 환경 변수를 사용하기 위함이다.
-> 암호화에 사용될 키값이 노출되면 결국 의미가 없기에 환경 변수를 사용하여 키를 숨기기 위함
이는 인텔리제이에 새로운 환경 변수를 등록하여 노출되지 않고 사용할 수 있다.
구성 편집에 들어가서 아래와 같이 설정해 주면 된다. key=뒤에 원하는 키값 설정
Jasypt의 암호화에 대한 결과를 온라인에서 쉽게 확인해 볼 수 있다.
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
Test
@Test
public void jasyptTest() {
//given
String password = "password1234";
StandardPBEStringEncryptor jasypt = new StandardPBEStringEncryptor();
jasypt.setPassword("test");
jasypt.setAlgorithm("PBEWITHMD5ANDDES");
//when
String encryptedText = jasypt.encrypt(password);
String decryptedText = jasypt.decrypt(encryptedText);
System.out.println(encryptedText);
System.out.println(decryptedText);
//then
assertThat(encryptedText).isNotEqualTo(password);
assertThat(decryptedText).isEqualTo(password);
}
기존 password의 암호화 및 복호화가 잘 이루어지는 것을 확인할 수 있다.
정리
민감 정보가 많기에 암호화가 필요한 상황이었다.
이를 해결하기 위해 Jasypt를 사용하여 민감정보를 암호화하였다.
하지만 민감정보를 암호화할 때 사용하는 키도 결국 숨겨야 했다.
숨기는 방법에는 여러 가지가 있는데 여기서는 환경 변수를 사용하여 해결하였다.
'Spring' 카테고리의 다른 글
필터(Filter) vs 인터셉터(Interceptor) 차이 (2) | 2023.05.12 |
---|---|
의존성 주입(Dependency Injection) (3) | 2023.05.11 |
@Autowire 빈 탐색 전략 (0) | 2023.05.11 |
@Configuration안에서 @Bean을 사용해야하는 이유 (0) | 2023.05.05 |
@Bean,@Configuration,@Component 차이점 (0) | 2023.05.05 |