JUST WRITE

Spring Boot Configuration with Jasypt 본문

Programing/Spring

Spring Boot Configuration with Jasypt

천재보단범재 2022. 1. 13. 15:59

Jasypt

Spring Boot Configuration with Jasypt

Spring Boot에서 Property 파일(application.properties, application.yml)로 많은 설정을 할 수 있다.

Property 파일에 Credintailas, Database 접속 정보 등 중요한 정보도 입력된다.

이런 민간함 정보는 그대로 노출하면 안된다.

Jasypt(Java Simplified Encryption)으로 Property 파일 정보를 암호화할 수 있다.

Jasypt

Java Simplified Encryption

Jasypt는 암호화에 대한 자세한 지식이 없어도 암호화 기능을 추가하도록 해주는 Java Library이다.

보통 Private data를 Database에 저장할 때 보안상의 이유로 암호화시킨 data로 저장한다.

간단한 Algorithm으로 구현하려면 Jasypt에서 BasicTextEncryptor Class가 좋다.

// Encrypt
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
String privateData = "secret-data";
// 암호화 1)
textEncryptor.setPasswordCharArray("some-random-data".toCharArray());
// 암호화 2)
textEncryptor.encrypt(privateData);

// Decrypt
textEncryptor.decrypt(myEncryptedText);

하지만 BasciTextEcryptor는 Authentication을 수행하기에는 적합하지 않다.

Authentication을 수행할때는 보통 One-way Encryption 방식이 좋다.

Database에는 암호화된 Text가 저장되어 있어 암호화된 Text만 비교해주면 된다.

Jasypt에서 BasicPasswordEncryptor가 One-way Encryption을 제공한다.

String password = "secret-pass";
BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
String encryptedPassword = passwordEncryptor.encryptPassword(password);

// Encrypt Text Check
boolean result = passwordEncryptor.checkPassword("secret-pass", encryptedPassword);

Algorithm for Encryption 설정

강력한 Encryption Alogrithm을 적용하 수 있다.

대신 JCE(Java Cryptography Extension) Unlimited Strength Jurisdiction Policy Files 설치가 필요하다.

Jasypt는 위 강력한 Encryption을 활용할 수 있는데 StandardPBEStringEncryptor를 사용하면 된다.

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
String privateData = "secret-data";
encryptor.setPassword("some-random-passwprd");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

Multi-Threaded Decryption

Multi-Thread 환경에서는 Decryption도 병렬로 처리해야 할 수 있다.

Jasypt에서는 이렇게 Multi-Thread 환경에서 적용할 수 있도록 PooledPBEStringEncryptor를 제공한다.

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);
encryptor.setPassword("some-random-data");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

Spring Boot Jasypt 적용

먼저 Spring Boot Application에 Jasypt Dependency를 추가해준다.

<dependency>
   <groupId>com.github.ulisesbocchio</groupId>
   <artifactId>jasypt-spring-boot-starter</artifactId>
   <version>3.0.3</version>
</dependency>

Jasypt Encyrptor를 Bean으로 만들어 준다.

@Bean(name= "jasyptStringEncryptor")
public StringEncryptor jasyptStringEncryptor() {
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    config.setPassword("test");
    config.setAlgorithm("PBEWithMD5AndDES");
    config.setKeyObtentionIterations("1000");
    config.setPoolSize(1);
    config.setProviderName("SunJCE");
    config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
    config.setStringOutputType("base64");
    encryptor.setConfig(config);

    return encryptor;
}

그리고 Property 파일에 Jasypt Encyptor Bean을 등록해준다.

jasypt:
  encryptor:
    bean: jasyptStringEncryptor // Bean 명 입력

Test Code를 작성해 Property 파일내 암호화 하길 원하는 값을 Encryption 해준다.

@Test
public void jasypt() {
    String text = "some-text";
    
    StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
    pbeEnc.setAlgorithm("PBEWithMD5AndDES");
    pbeEnc.setPassword("test");

    System.out.format("after encryption: %s", pbeEnc.encrypt(text));
}

그 다음 Encrypt한 값을 Property 파일에 적용해준다.

ENC(%s) 이러한 형식으로 넣어준다.

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: ENC(cuLOhHRtVIguaunfYi2h6VVxgCbF1bt6c1ZZluglf5p4Op2TyL4xFMfWB4wusDjL5blT6JHUyAUBLXRF2JzKuOBPoeJW64tg)
    username: ENC(VONpVwD4Rb/FO1n/sehxpFVNIDT8xCU0)
    password: ENC(VONpVwD4Rb/FO1n/sehxpFVNIDT8xCU0)

 

728x90
반응형

'Programing > Spring' 카테고리의 다른 글

HTTP/2.0 적용  (0) 2022.01.11
@ControllerAdvice Exception 처리  (0) 2022.01.03
BeanFactory vs ApplicationContext  (0) 2021.12.21
Bean Annotations  (0) 2021.12.20
@Autowired  (0) 2021.10.22
Comments