일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- OS
- Vision
- aws s3
- EC2
- grafana
- java
- JavaScript
- jvm
- Trino
- kubectl
- Operating System
- kubernetes
- Python
- AWS
- Network
- log
- MAC address
- CVAT
- zookeeper
- tcp
- docker
- Spring
- kubeadm
- PostgreSQL
- airflow
- Kafka
- Packet
- CSV
- helm
- ip
- Today
- Total
JUST WRITE
Spring Boot Configuration with 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)
'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 |