반응형
Spring yml 파일 비밀번호 암호화 처리
#정보보안 #보안검증
username: 사용자
password: 비밀번호1234
Jasypt
설정 파일 비밀번호 처리
- 비밀번호는 암호화되어 표기
- 의존성과 @Configuration 등록 하면 Spring Boot 실행 시, Jasypt가 자동으로 ENC(...)로 감싸진 값을 복호화 하여 사용
username: 사용자
password: ENC(2lBxSp5ad3D7X3Q==)
1. Spring Boot 의존성 추가
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.76</version>
</dependency>
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt</artifactId>
<version>1.9.3</version>
</dependency>
2. application.yml 설정 파일 암호화 키 추가
jasypt.encryptor.password=jasypt암호키 # Jasypt 암호화 키 설정
3. @Configuration 설정 @Bean 등록 (Jasypt 커스텀 설정)
@EnableEncryptableProperties : 자동 복호화 설정
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.beans.factory.annotation.Value;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
@Configuration
@EnableEncryptableProperties // Jasypt를 사용하여 설정 파일의 암호화된 값을 자동으로 복호화하도록 활성화
public class JasyptConfig {
// jasypt 암호화 키
@Value("${jasypt.encryptor.password}")
private String jasyptPassword;
@Bean
public PooledPBEStringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setProvider(new BouncyCastleProvider()); // 강력 암호화 프로바이더 설정
encryptor.setPoolSize(4); // poolsize : 코어 수와 비슷한 값 (일반 웹 서비스 : 2~4)
encryptor.setPassword(jasyptPassword); // jasypt 암호화 키
encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256");
return encryptor;
}
}
[참고] 테스트
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import java.security.Security;
public class SecureEncryptionUtil {
static {
// Bouncy Castle 프로바이더 추가
Security.addProvider(new BouncyCastleProvider());
}
private static final String SECRET_KEY = "jasypt암호키"; // jasypt 암호 키
private static final String ALGORITHM = "PBEWithHMACSHA512AndAES_256"; // 사용 알고리즘
/**
* 암호화 함수
*/
public static String encrypt(String plainText) {
PooledPBEStringEncryptor encryptor = getEncryptor();
return encryptor.encrypt(plainText);
}
/**
* 복호화 함수
*/
public static String decrypt(String encryptedText) {
PooledPBEStringEncryptor encryptor = getEncryptor();
return encryptor.decrypt(encryptedText);
}
/**
* Jasypt Pooled 암호화 객체 설정
*/
private static PooledPBEStringEncryptor getEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setProvider(new BouncyCastleProvider()); // Bouncy Castle 사용
encryptor.setPoolSize(4); // 병렬 처리 성능 최적화
encryptor.setPassword(SECRET_KEY); // 암호화 키
encryptor.setAlgorithm(ALGORITHM); // 강력한 알고리즘 적용
return encryptor;
}
/**
* 테스트용 main 함수
*/
public static void main(String[] args) {
String originalText = "비밀번호1234";
// 원본
System.out.println("원본 : " + originalText);
// 암호화
String encryptedText = encrypt(originalText);
System.out.println("암호화(복사하여 yml에 설정) : ENC(" + encryptedText + ")");
// 복호화
String decryptedText = decrypt(encryptedText);
System.out.println("복호화(확인) : " + decryptedText);
}
}반응형
'skill > Spring' 카테고리의 다른 글
| [Spring] application.yml 개발, 상용 분리 (0) | 2025.03.18 |
|---|