기존에 운영중인 서비스에 적용된 암호화 알고리즘이 취약하다는 결과를 받았다.

 

확인해보니 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

새 폴더 (1).zip
3.43MB

+ Recent posts