지금 들어온 프로젝트에서는 application.properties의 DB 접속정보가 모두 암호화되어있다. 생전 이런건 또 처음이라 뒤져보니 역시나 보안을 위한 암호화라고. 뭐 내부망에서만 배포되고 서버내에서만 존재하는 *properties까지 암호화할일은 무엇인가 싶긴 한데 뭐 어디선가는 또 쓰기 마련이지. 아무튼 대략적으로 구현해보고 에러 트라이도 해보고 잘 볶아보았다.
1. pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<!-- Spring Boot 2.7.8 에서 설정함 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 암복호화 모듈 jasypt -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!-- 테스트를 수행해본 mariadb -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.11</version>
</dependency>
|
cs |
대충 스프링부트 2.7.8에 jasypt 3.0.5 버전을 적용했다, 이마리야
2. JasyptConfig.java
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
31
32
|
package com.test.comm.util;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
@Configuration
@EnableEncryptableProperties
public class JasyptConfig {
@Value("${password}")
private String passwd;
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(passwd); // 암호화키
config.setAlgorithm("PBEWithMD5AndDES"); // 알고리즘
config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
config.setPoolSize("1"); // 인스턴스 pool
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스
config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); // PBEWithMD5AndDES 사용시에는 이걸 해줘야함
config.setStringOutputType("base64"); //인코딩 방식
encryptor.setConfig(config);
return encryptor;
}
}
|
cs |
별로 어려운 것 없이 이거 하나 구현해주면 다 끝난다. 그럼 암호화된 properties의 값들을 복호화해서 쓰게 됨.
자 그럼 데이터를 어떻게 암호화 하냐면,
3. Junit Test
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
|
package com.test;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
public class Test {
@org.junit.Test
public void test() {
String url = "jdbc:mariadb://127.0.0.1:3306/mysql";
String username = "root";
String password = "1234";
System.out.println(jasyptEncoding(url));
System.out.println(jasyptEncoding(username));
System.out.println(jasyptEncoding(password));
}
public String jasyptEncoding(String value) {
String key = "sssss";
StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
pbeEnc.setAlgorithm("PBEWithMD5AndDES");
pbeEnc.setPassword(key);
return pbeEnc.encrypt(value);
}
}
|
cs |
난 그냥 junit test로 돌렸는데 아무 클래스 하나 파고 하드코딩(?)같이 해서 암호화 돌려도 상관없다.
algorithm의 경우에는 고객사에서 사용하는 방식으로 적용했고, key는 복호화할때도 써야하는것이니까 잘 보관해야 한다.
쟤네들을 암호화 하면 salt값 포함, 다음과 같은 값이 추출된다.
4. application.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
#암호화 적용
spring.datasource.url=ENC(VIM2Q6Cr058I98tDUqk9t5AzhbOBtg7prpvmLVo4RMMAvb0vIvzPnggGZlJMOXmH)
spring.datasource.username=ENC(AGGJxx/HldORQzlVuuGTXQ==)
spring.datasource.password=ENC(mCuZLaeAjXHejmp6gW4Yuw==)
#암호화 미적용
#spring.datasource.url=jdbc:mariadb://127.0.0.1:3306/mysql
#spring.datasource.username=root
#spring.datasource.password=1234
#JasyptConfig 에서 설정한 BeanName
jasypt.encryptor.bean=jasyptStringEncryptor
#JasyptConfig 에서 사용할 passkey
password=sssss
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator
|
cs |
주석에 내용이 다 달려있어서 문제는 없다.
다만, PBEWithMd5AndDES 암호화를 사용하는 경우 datasource.password를 복호화하지 못하는 이슈가 발생하였고,
JasyptConfig 에 iv-generator-classname을 위와 같이 설정해주어야 한다.
properties에 설정해도 먹히기도 하고, 안먹히기도 한다. 뭐야 이거 양자역학이야?
이 이슈는 위의 암호화 방식만 해당되는 내용이므로 다른 방식으로 적용할 경우에는 문제가 없을것이라 판단된다.
'어장 Develop > 어장 JAVA' 카테고리의 다른 글
[maven] 외부라이브러리 포함 build (package) (0) | 2024.02.27 |
---|---|
[zip4j] java에서 파일 압축/압축해제 (암호포함) (0) | 2024.02.23 |
[SpringBoot] mybatis를 활용한 DB Connection (0) | 2024.02.21 |
[Powershell] Java에서 powershell을 파라미터로 호출하기 (0) | 2022.10.11 |
[hwplib] hwplib을 이용한 한글파일 텍스트 추출 (1) | 2022.07.06 |