Spring

[ Springboot ] 설정파일(properties, yml) 암호화

구티맨 2020. 5. 22. 15:09

설정파일에 비밀번호와 같은 민감정보를 저장하는 경우가 있는데, 보안을 위해 암호화 하는 방법을 알아보겠다.

암호화에는 jasypt( Java Simplified Encryption ) 자바 암호화 라이브러리를 사용하였다.

 

먼저, Springboot 용 라이브러리 및 BouncyCastle 라이브러리 를 추가한다.

compile (group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '2.1.1')
compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.61'

Configuration 클래스에 @EnableEncryptableProperties를 추가해주고, 암호화에 사용할 빈을 생성한다.

예제에서는 PBE( Password Based Encryption ) 를 사용하고, SHA256, AES128 사용을 위해 BouncyCastle 라이브러리를 사용한다.

BouncyCastle 은 PBE에 보다 많은 알고리즘을 제공해 준다.

@Configuration
@EnableEncryptableProperties
public class PropertyEncyptConfiguration {

    @Bean("encryptorBean")
    public PooledPBEStringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setProvider(new BouncyCastleProvider());
        encryptor.setPoolSize(2);
        encryptor.setPassword("xoxo");
        encryptor.setAlgorithm("PBEWithSHA256And128BitAES-CBC-BC");
        return encryptor;
    }
}

테스트 코드에, 암호화할 데이터를 암복호화 해본다.

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setProvider(new BouncyCastleProvider());
encryptor.setPoolSize(2);
encryptor.setPassword("xoxo");
encryptor.setAlgorithm("PBEWithSHA256And128BitAES-CBC-BC");

String plainText = "test";
String encryptedText = encryptor.encrypt(plainText);
String decryptedText = encryptor.decrypt(encryptedText);
System.out.println("Enc:"+encryptedText+", Dec:"+decryptedText);
Enc:iLe7hTPNHCF+o2vbKDpict0DKEhtSTBHuJk4mw1Tiheg6WdSwyJ96B1hejJTf+sp, Dec:test

 

설정 파일에, 암호화를 하는 bean 이름을 지정해 주고, 암호화된 내용을 작성해 준다.

jasypt:
  encryptor:
    bean: encryptorBean
    
password: ENC(iLe7hTPNHCF+o2vbKDpict0DKEhtSTBHuJk4mw1Tiheg6WdSwyJ96B1hejJTf+sp)