Java Simplified Encryption(Jasypt)

업데이트:

Jasypt1

  • 개발자가 암호화에 대한 이해도가 높지 않더라도 프로젝트에 암호화 기능을 추가 할 수 있도록 고안된 Java Library이다.
  • 단방향 및 양방향 암호화 모두에 높은 보안, 표준 기반의 암호화 기술 등을 제공한다.
  • Spring 기반 애플리케이션과 Spring Security와 통합이 가능하다.

Bouncy Castle2

  • Java 및 C#용 경량 암호화 오픈 소스 API이다.
  • JCE(Java Cryptography Extension)3 공급자보다 더 보안적으로 강력한 암호화 패키지이다.
  • AES(Advanced Encryption Standard)4 알고리즘을 구현하였다.

Spring with Jasypt

  • Jasypt의 digesters와 encryptors를 Spring Bean으로 등록하여 Spring 애플리케이션 컨텍스트에서 인스턴스화와 종속성 주입을 지원한다.
  • Spring Bean으로 등록된 Jasypt의 digesters와 encryptors는 Thread-Safe하다.
  • Spring에서 Jasypt를 사용하기 위해서 PropertySource 인터페이스에 대한 암호화 인식 구현을 제공한다.

PooledPBE*Encryptor Bean

@Configuration
public class PropertyEncryptConfig {

  private static final String PASSWORD = "GracefulSoul";
  private static final String SHA256_AES128_ALGORITHM = "PBEWithSHA256And128BitAES-CBC-BC";

  @Bean
  public PooledPBEStringEncryptor pooledPBEStringEncryptor() {
    PooledPBEStringEncryptor pooledPBEStringEncryptor = new PooledPBEStringEncryptor();
    pooledPBEStringEncryptor.setProvider(new BouncyCastleProvider());
    pooledPBEStringEncryptor.setPoolSize(2);
    pooledPBEStringEncryptor.setPassword(PASSWORD);
    pooledPBEStringEncryptor.setAlgorithm(SHA256_AES128_ALGORITHM);
    return pooledPBEStringEncryptor;
  }

}
  • Spring Configuration Annotation으로 PropertyEncryptConfig를 정의하고, 내부에 PooledPBEStringEncryptor를 Bean으로 생성해준다.
  • Provider는 암복호화에 사용되는 공급자로, 일반적인 JCE보다 더 보안적으로 강력한 Bouncy Castle을 사용하는 것을 추천한다.
  • PoolSize는 암복호화 요청에 대한 Worker의 개수로 생각하면 된다. PoolSize만큼 Encryptor를 복제하여 사용하도록 되어있다.
  • Password는 암복호화에 사용되는 Key이다.
  • Algorithm은 Provider에서 제공되는 암복호화에 사용될 알고리즘을 지정하는 것이다.
  • 위 항목들은 모두 필수 값으로 설정하지 않으면 IllegalArgumentException이 발생한다.

Used

jasypt.encryptor.bean=pooledPBEStringEncryptor
user.drink=ENC(cPKFOgVppX+//d5nE206topFdbxaUuyWbP8lA45rb64=)
@Service
public class UserService {

  @Value("${user.drink}")
  private String drink;

  public String getDrink() {
    return this.drink;
  }

}
  • application.properties에 위의 PooledPBEStringEncryptor를 이용하여 암호화 한 값을 ENC() 키워드 괄호 안에 넣어준다.
  • Spring Expression Language(SpEL)5을 사용하여 암복호화 사용을 Sample로 사용하였지만, 위에서 설명하였듯이 PropertySource 인터페이스에 대한 암호화 인식 구현을 통해 값을 가져올 경우 자동으로 복호화하여 사용되는 모든 항목에 적용이 된다.
  • 단, Test code를 작성하는 경우에 Spring IOC에 의해 Bean이 생성되지 않으면 당연히 복호화는 동작하지 않는다.

Review

  • Spring Application을 업무용도로 개발 및 사용할 경우 application.properties 내부의 시스템의 URL과 Password를 난독화 해야 할 필요성이 존재하므로 Jasypt를 사용하면 쉽게 이를 해결 할 수 있다.
  • 시스템의 난독화 및 암호화는 선택이 아니라 필수로 생각해야 할 만큼 사회에 대한 필수 요소로, 보안을 무시하고 개발하는 경우 개인 뿐 아니라 사회에 피해가 갈 수 있음을 개발자는 상시 고려해야 한다.

Reference

※ Sample Code는 여기에서 확인 가능합니다.

댓글남기기