Jasypt
이란?Jasypt (Java Simplified Encryption
)는 Java
애플리케이션에서 암호화와 복호화를 간편하게 처리할 수 있도록 돕는 라이브러리이다. 민감한 정보를 안전하게 보호하기 위해 설계된 Jasypt
는 Spring Boot
와 쉽게 통합할 수 있어 개발자들에게 매우 유용하다.
(Encryption)
암호화는 데이터를 읽을 수 없는 형태로 변환하는 과정이다. 이는 데이터를 보호하고 무단 접근을 방지하는 데 사용된다. 암호화된 데이터는 알고리즘과 비밀 키를 사용하여 변환된다.
(Decryption)
복호화는 암호화된 데이터를 원래의 읽을 수 있는 형태로 복원하는 과정이다. 암호화에 사용된 알고리즘과 비밀 키가 필요하다.
(Secret Key)
비밀 키는 암호화와 복호화에 사용되는 중요한 요소이다. 키가 노출되면 암호화된 데이터가 쉽게 해독될 수 있기 때문에, 비밀 키는 안전하게 관리해야 한다.
(Algorithm)
암호화 알고리즘은 데이터를 암호화하고 복호화하는 데 사용되는 수학적 규칙을 정의한 것이다. 각 알고리즘은 특정한 암호화 방식과 키 길이를 사용하여 데이터를 변환한다.
Jasypt
의 주요 기능Jasypt
는 Spring Boot
와 통합되어 애플리케이션 설정 파일에서 자동으로 암호화된 값을 처리할 수 있다. 설정 파일에서 암호화된 값을 읽고 자동으로 복호화하여 사용할 수 있다.
Jasypt
는 다양한 암호화 알고리즘을 지원한다. 따라서 개발자는 애플리케이션의 보안 요구 사항에 맞는 알고리즘을 선택할 수 있다.
이름 | 성능 | 용도 | 특징 |
---|---|---|---|
PBEWithMD5AndDES | 낮음 | 구형 시스템, 낮은 보안 요구 사항 | MD5 해시와 DES 암호화를 사용. 보안 강도가 낮아 현대 보안 요구 사항에 부족할 수 있음 |
PBEWithSHA1AndDESede | 중간 | 중간 수준의 보안 요구 사항 | SHA-1 해시와 DESede(Triple DES) 암호화를 사용. DES에 비해 보안 강도가 강화됨 |
PBEWithSHA256AndAES_256 | 높음 | 높은 보안 요구 사항 | SHA-256 해시와 AES 256비트 암호화를 사용. 매우 강력한 보안을 제공하며 현대 보안 표준을 충족 |
Jasypt
는 Spring
기반 애플리케이션와 쉽게 통합되며, 간단한 설정으로 다양한 곳에서 암호화 기능을 사용할 수 있다.
Hibernate 통합: Jasypt
를 Hibernate
와 통합하면 데이터베이스의 민감한 정보를 자동으로 암호화 및 복호화할 수 있다. AttributeConverter
를 사용하여 엔티티 필드에 암호화 로직을 쉽게 적용할 수 있다.
Spring Security 통합: Jasypt
를 Spring Security
와 통합하여 비밀번호와 같은 민감한 정보를 안전하게 암호화하고 복호화할 수 있다. 커스텀 PasswordEncoder
를 구현하여 보안 기능을 강화할 수 있다.
Jasypt
적용하기Jasypt
의 기본적인 개념에 대해 다루었으니 이제 실제 Spring Boot
파일에 적용해 보자. 먼저, Jasypt
의 실제 동작 단계에 대해 알아보자.
Jasypt
의 동작 단계암호화 설정: SimpleStringPBEConfig
또는 PooledPBEStringEncryptor
클래스 등을 사용하여 암호화 설정을 구성한다. 비밀 키와 암호화 알고리즘을 설정한다.
암호화: 입력 데이터를 암호화한다. 이 과정에서는 비밀 키와 설정된 암호화 알고리즘을 사용하여 데이터를 암호화한다.
복호화: 암호화된 데이터를 복호화한다. 암호화와 동일한 비밀 키와 알고리즘을 사용하여 암호화된 데이터를 원래 형태로 복원한다.
Secret Key
)Jasypt
에서 비밀 키 (Secret Key
)는 유출되면 안되는 만큼 설정 파일에 직접 작성하기보단 PC나 IDE 등에서 따로 환경 변수를 설정하는 편이 좋다.
나같은 경우 IntelliJ
의 Edit Configurations
에서 환경 변수를 설정해 주었다.
Environment variables
를 정상적으로 설정했을 경우 사진과 같이 KEY=VALUE
형식이 된다.
로그인 기능에서 필요한 의존성을 pom.xml
의 dependencies
에 추가한다.
Maven
- pom.xml
파일에 추가<dependencies>
··· 생략 ···
<!-- jasypt (데이터 암호화) -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
··· 생략 ···
</dependencies>
Gradle
- build.gradle
파일에 추가implementation 'org.jasypt:jasypt:1.9.3'
yml
또는 properties
파일 설정jasypt:
encryptor:
password: ${ENCRYPT_KEY} # 환경 변수에서 가져옴
algorithm: PBEWithMD5AndDES
key-obtention-iterations: 1000
pool-size: 1
salt-generator-classname: org.jasypt.salt.RandomSaltGenerator
iv-generator-classname: org.jasypt.iv.NoIvGenerator
string-output-type: base64
password
: 비밀 키를 의미, 여기선 환경 변수에서 설정한 값을 가져온다.
algorithm
: 암호화 알고리즘을 설정한다.
PBEWithMD5AndDES
를 사용했지만 실제 애플리케이션에서는 더욱 복잡한 알고리즘을 사용하는 편이 좋다.JasyptConfig
클래스 추가@Configuration
public class JasyptConfig {
@Bean("jasyptStringEncryptor")
public PooledPBEStringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(System.getenv("ENCRYPT_KEY"));
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
Spring Boot
애플리케이션에서 Jasypt
설정을 읽어들여 암호화와 복호화를 자동으로 처리하도록 @Configuration
클래스를 추가한다.
@EnableEncryptableProperties
적용@SpringBootApplication
@EnableEncryptableProperties
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
@EnableEncryptableProperties
어노테이션을 사용하면, 애플리케이션의 설정 파일에서 암호화된 값을 직접 읽어와 자동으로 복호화할 수 있다.
Jasypt
는 Java 애플리케이션에서 암호화와 복호화를 간편하게 처리할 수 있도록 돕는 강력한 도구이다. Spring Boot
와 쉽게 통합되어 설정 파일의 민감한 정보를 안전하게 보호할 수 있으며, 다양한 암호화 알고리즘을 지원하여 애플리케이션의 보안 요구 사항에 맞는 설정이 가능하다.
Jasypt
를 통해 민감한 정보를 보호하고 보안을 강화함으로써, 애플리케이션의 신뢰성을 높일 수 있다. 보안을 위해 앞으로 애플리케이션을 개발할 때 사용해 보자!