기존에 운영중인 서비스에 적용된 암호화 알고리즘이 취약하다는 결과를 받았다.
확인해보니 jasypt을 이용해 암호화가 진행되거 있었고
라이브러리 버전이 낮아 지원되는 알고리즘은 안전하지 못했다.. !
jasypt 버전을 올리려고보니.. SpringBoot 나 기타 다른 서비스의 버전도 올려줘야하는 부분이 있어
곤란해졌다. ( 운영중인 서비스로 리스크가 있어 여러가지 버전을 한번에 올리기가 애매한 상황.. )
다른 버전은 건들지 않고
bouncycastle을 추가 적용해보니 더 많은 안전한 알고리즘 사용이 가능했다!
그럼 조치 시작~
1. lib 폴더에 bcprov-jdk15on-1.60.jar 추가 ( 첨부파일 확인 )

2. pom.xml Bouncycastle 추가
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/bcprov-jdk15on-1.60.jar</systemPath>
</dependency>
3. jasyptConfig.java
* 사용가능한 알고리즘 목록 조회
List<Object> supported = new ArrayList<>();
List<Object> unsupported = new ArrayList<>();
for (Object algorithm : AlgorithmRegistry.getAllPBEAlgorithms()) {
  try {
    StandardPBEStringEncryptor encryptor1 = new StandardPBEStringEncryptor();
    encryptor1.setPassword("somePassword");
    encryptor1.setAlgorithm(String.valueOf(algorithm));
    String str = "test";
    String encStr = encryptor1.encrypt(str);
    String decStr = encryptor1.decrypt(encStr);
    supported.add(algorithm);
  } catch (EncryptionOperationNotPossibleException e) {
  	unsupported.add(algorithm);
  }
}
for (Object s : supported) {
	System.out.println(s);
}
- 1) 암호화
private static final String ENCRYPT_KEY = "asdasdasdasdasdasdassdwwwdd11wq";
@Test
    public void test () { 
        Security.addProvider(new BouncyCastleProvider());
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();
 
        config.setPassword(ENCRYPT_KEY);
        config.setAlgorithm("PBEWITHSHA256AND256BITAES-CBC-BC");
        encryptor.setConfig(config);
 
        String url = encryptor.encrypt("jdbc:oracle:thin:@192.168.11.123:1521/ORCL");
        String username= encryptor.encrypt("testid");
        String pass = encryptor.encrypt("dbpassword");
       
        System.out.println(url);
        System.out.println(username);
        System.out.println(pass);
 
        // decrypt 테스트 
       System.out.println(encryptor.decrypt(url));
   } 
=== run as > JUnit Test 실행
콘솔에서 암호화된 값을 확인할 수 있다.
- 2) 적용
@Bean("JasyptStringEncryptor")
    public StandardPBEStringEncryptor stringEncryptor() {
        Security.addProvider(new BouncyCastleProvider());
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();
 
        config.setPassword(ENCRYPT_KEY);
        config.setAlgorithm("PBEWITHSHA256AND256BITAES-CBC-BC");
        encryptor.setConfig(config);
 
        return encryptor;
    }
application.properties 암호화된 값 입력
spring.datasource.url=ENC(asdasdasdwwe2123123qewqwe+o46dbmkQpVu20=)
spring.datasource.username=ENC(sfsdfsr342343456efgfgdfdd==)
spring.datasource.password=ENC(gggffrrww+WbWPoAMddlLrkXFcE)
boot 실행 후 DB 연결이 잘 되는지 확인하기
끝!
관련내용)
genie-dev.tistory.com/50?category=915648
jasypt를 이용한 DB 접속 정보 암호화 방법
DB 접속 정보를 암호화 하는 이유 프로젝트 내 DB 연결 값을 암호화 하지 않고 그대로 올릴 경우 서버에 직접 접근하지 않는 이상 확인하기 어렵겠지만 접속이 가능하다면 누구나 DB 정보를 확인��
genie-dev.tistory.com
'Spring' 카테고리의 다른 글
| Spring 특정 URL만 encoding 다르게 처리하기 (0) | 2021.01.21 | 
|---|---|
| SpringBoot robots.txt 적용 (0) | 2020.12.14 | 
| Springboot Jar systemctl로 실행하기! ( 백그라운드 실행 ) (0) | 2020.10.08 | 
| jasypt를 이용한 DB 접속 정보 암호화 방법 (0) | 2020.09.14 | 
| SpringBoot 백그라운드 실행 (nohup 사용법) (0) | 2020.09.10 |