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는 여기에서 확인 가능합니다.
댓글남기기