skill/Spring

Spring 설정파일 비밀번호 암호화 Jasypt

have a nice day :D 2025. 3. 18. 12:05
반응형

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