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

 

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

 

현재 내가 사용중인 라이브러리에서 사용가능한 알고리즘 목록을 출력할 수 있다. 

 

버전을 올린다던지 알고리즘 변경할때 사용하면 좋을 것 같다. 

 

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
import org.jasypt.registry.AlgorithmRegistry;


for (Object algorithm : AlgorithmRegistry.getAllPBEAlgorithms()) {
  try { 
    StandardPBEStringEncryptor encryptor2 = new StandardPBEStringEncryptor(); 
    encryptor2.setPassword("somePassword"); 
    encryptor2.setAlgorithm(String.valueOf(algorithm)); 
    String str = "test"; 
    String encStr = encryptor2.encrypt(str); 
    String decStr = encryptor2.decrypt(encStr); 

  	System.out.println("supported :::: " +algorithm);
  } catch (EncryptionOperationNotPossibleException e) {

  	System.out.println("unsupported :::: " + algorithm);
  } 
}

 

DB 접속 정보를 암호화 하는 이유 

프로젝트 내 DB 연결 값을 암호화 하지 않고 그대로 올릴 경우 서버에 직접 접근하지 않는 이상 확인하기 어렵겠지만 

 

접속이 가능하다면 누구나 DB 정보를 확인할 수 있다는 보안 취약점이 있다. 

 

그래서 가능한 민감 정보는 암호화해서 사용하는 것을 권장한다.  (필수는 아니다)

 

 

 

암호화를 위해  jasypt 사용 

나의 경우 jasypt 를 사용한 암호화 작업을 진행했다. 

 

 

pom.xml

<dependency>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-spring-boot-starter</artifactId>
	<version>1.18</version>
</dependency>

 

jasyptConfig.java

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JasyptConfig {
	private static final String ENCRYPT_KEY = "skdmldufthlrkqtdlqslek"; // 임의로 지정한 키값 

    @Bean("JasyptStringEncryptor")
    public StandardPBEStringEncryptor stringEncryptor() {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();

        config.setPassword(ENCRYPT_KEY);
        config.setAlgorithm("PBEWithSHA1AndRC4_128");
        encryptor.setConfig(config);

        
        return encryptor;
    }
    
    
    
    
    // DB에 연결할 url, password 등의 입력값을 암호화 해서 넣어주려고 할 때 
    // 다운받아서 쓰는 방법도 있지만 나는 main 메서드 하나 파서 암호화 작업함. 
    // 실제 프로젝트를 업로드할때에는 main 메서드는 지워주기! 
	public static void main(String[] args) {
		StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();

        config.setPassword(ENCRYPT_KEY);
        config.setAlgorithm("PBEWithSHA1AndRC4_128"); // 알고리즘을 잘 골라야한다. 취약하지 않은 알고리즘으로
        encryptor.setConfig(config);
        
        // DB 하나만 연결할 때
        String url = encryptor.encrypt("jdbc:oracle:thin:@192.168.01.01:1521/orcl");
        
        // DB 다중화 되어있어 여러개 연결할 경우.
        // String url = encryptor.encrypt("@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.01.01)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.01.02)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl)))");

        String username= encryptor.encrypt("mytest");
        String pass = encryptor.encrypt("test1234");
        
        System.out.println(url);
        System.out.println(username);
        System.out.println(pass);      
      
      // 프로젝트 우클릭 run As -> java Application 실행하면 콘솔창에서 암호화된 값을 
      // 확인할 수 있다. ( 단축키 : alt +shift+x  누른다음 j 눌러주기.
      
        
	}
}

 

실행하면 아래와 같이 암호화 키를 얻을 수  있다! 

 

 

application.properties ( 꼭 이 파일이 아니더라도 내가 설정해둔 properties에 상황에 맞게 넣어주면된다. ) 

spring.datasource.url=ENC(dzUolknJnznQLlBweSj2AOhP1V6cOlZcGqhC/0uM7YBIQGKk+VAQYbNqXUCDoI4fgw==)
spring.datasource.username=ENC(jEOr0qnaLLVoIZ6bzSo=)
spring.datasource.password=ENC(zzkHO3LV9EauEoLpzvRrxw==)

 

+ Recent posts