1. Jasypt란?
Jasypt(Java Simplified Encryption)는 자바 애플리케이션에서 민감한 정보를 쉽게 암호화하고 복호화할 수 있는 라이브러리입니다. 이를 활용하여 Spring Framework의 application.yml 파일 내의 비밀번호와 같은 민감한 데이터를 안전하게 보호할 수 있습니다.
2. 설정 단계
Step 1. Jasypt 라이브러리 의존성 추가
우선, Jasypt를 사용하기 위해 프로젝트에 해당 라이브러리를 추가해야 합니다. Maven 또는 Gradle 프로젝트에 따라 pom.xml 또는 build.gradle 파일에 다음과 같이 추가하세요.
Maven:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
Gradle:
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
Step 2. 암호화 키 설정
암호화/복호화에 사용될 키를 설정합니다. 이 키는 민감한 정보이므로 노출되지 않도록 관리해야 합니다. 예를 들어 환경 변수로 설정할 수 있습니다.
# application.yml
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD}
환경 변수로 JASYPT_ENCRYPTOR_PASSWORD를 설정하거나, 로컬에서 테스트할 때는 application.yml에 직접 값을 설정할 수도 있습니다.
Step 3. Java Config 파일 설정
암호화된 비밀번호를 읽을 수 있도록 Java Config 파일을 작성합니다. JasyptConfig 클래스를 만들어 암호화 설정을 추가합니다.
저는 키를 JasyptConfig 안에 그냥 넣어서 작업 했습니다
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JasyptConfig {
@Bean(name = "jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
String key = "anp_jasyp_sec_key";
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(key); // 암호화할 때 사용하는 키
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;
}
}
Step 4-1. 비밀번호 암호화하기
Jasypt CLI 또는 코드로 직접 암호화할 수 있습니다. 예를 들어 데이터베이스 비밀번호 mySecretPassword를 암호화해보겠습니다.
터미널에서 다음 명령어를 사용하여 암호화합니다:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="mySecretPassword" password=yourEncryptorPassword algorithm=PBEWithMD5AndDES
Step 4-2. 테스트 Java 파일로 비밀번호 암호화하기
엄호화 하는 테스트 Java 파일 만들어서 실행해서 확인하기
import org.assertj.core.api.Assertions;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.junit.jupiter.api.Test;
class JasyptConfigTest {
@Test
void jasypt(){
String url = "자신의 DB URL";
String username = "자신의 DB USER";
String password = "자신의 DB PASSWORD";
String encryptUrl = jasyptEncrypt(url);
String encryptUsername = jasyptEncrypt(username);
String encryptPassword = jasyptEncrypt(password);
System.out.println("encryptUrl : " + encryptUrl);
System.out.println("encryptUsername : " + encryptUsername);
System.out.println("encryptPassword : " + encryptPassword);
Assertions.assertThat(url).isEqualTo(jasyptDecryt(encryptUrl));
}
private String jasyptEncrypt(String input) {
String key = "암호화에 쓰일 키값";
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setAlgorithm("PBEWithMD5AndDES");
encryptor.setPassword(key);
return encryptor.encrypt(input);
}
private String jasyptDecryt(String input){
String key = "복호화에 쓰일 키값";
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setAlgorithm("PBEWithMD5AndDES");
encryptor.setPassword(key);
return encryptor.decrypt(input);
}
}
Step 4-2. 암호화 지원해주는 사이트 활용해서 비밀번호 암호화하기
암호화 해주는 사이트 활용하기
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
이 명령어는 암호화된 비밀번호를 출력해줍니다. 이를 application.yml에 다음과 같이 추가합니다:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: myuser
password: ENC(encryptedPasswordHere)
ENC()는 Jasypt가 이 값을 복호화할 필요가 있다는 것을 인식하게 합니다.
3. Jasypt 설정 및 테스트
Jasypt는 설정된 암호화 키를 사용하여 ENC()로 감싼 값을 자동으로 복호화합니다. 이제 애플리케이션을 실행하면 application.yml 파일에 있는 암호화된 비밀번호가 올바르게 복호화되어 데이터베이스 연결에 사용됩니다.
테스트 예제로 간단한 Spring Boot 애플리케이션을 작성해 봅니다:
@RestController
public class TestController {
@Value("${spring.datasource.password}")
private String dbPassword;
@GetMapping("/showPassword")
public String showPassword() {
return dbPassword;
}
}
위 컨트롤러는 application.yml 파일에 설정된 datasource.password 값을 복호화하여 반환합니다. /showPassword 경로로 접근하면 암호화된 비밀번호가 복호화된 상태로 출력되는 것을 확인할 수 있습니다.
4. 주의사항
- 암호화 키는 보안이 필요한 곳에 안전하게 보관되어야 합니다.
- 개발 및 배포 환경에 따라 암호화 키를 다르게 설정하여 보안을 강화할 수 있습니다.
'Develop > JAVA' 카테고리의 다른 글
[Java] 오늘날짜 구하기 날짜 더하기 빼기 (3) | 2024.11.14 |
---|---|
[Java] 크로스 사이트 스크립트 (XSS) 취약점 조치방법 (7) | 2024.10.30 |
[Java] Spring Security 에서 SameSite 설정방법 (PG사 결제 시 리턴 후 세션 끊김현상 해결) (6) | 2024.10.24 |
[Java] BigDecimal 나누기 소수점 올림, 버림, 반올림 사용방법 (5) | 2024.10.21 |
[Spring Boot] application.yml 변수 Java Static 변수에서 사용하는 방법 (12) | 2024.10.15 |