Home > Java > Jasypt 암호화

Jasypt 암호화
java 백기선 Live Study

jasypt 이란


프로젝트를 하면서 이메일 인증이나 DB정보를 저장할 때 값을 노출 시킨 상태에서 github에 올린다면 해킹의 여지가 있기에 jasypt 라이브러리를 사용하자는 이야기가 나왔다.

일단은 암호화에 대한 내용을 찾아봤다.

암호화란 메시지 내용이 불명확하도록 평문을 재구성하는 방식이 메시지의 재구성 방법을 암호화 알고리즘이라 부르고 비밀성을 높이기 위해 key를 사용한다.

암호화와 복호화 과정으로 구성된 시스템을 암호계라 부르며 암호계에는 키 알고리즘, 관용암호계(암호화 복호화에 둘다 사용하는)와 비밀키 공개키를 사용하는 공개키 시스템으로 구분된다고 한다.

여기서 Jasypt은 암호화에 대한 깊은 지식이 없어도 암복호화 프로그램 개발을 지원한다.

jasypt 개요, 설명 사이트

jasypt 사용법


일단 build.gradle의 dependency에 jasypt 등록하시고

    //jasypt
    implementation "com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3"

jasypt 암복호화 지원 사이트

링크 들어가셔서 중간에 보시면 암복호화 할 수 있는 기능이 있는데 여기에

jasypt_create

  • Enter plain text to Encrypt = “암호화 할 평문”

  • Select Type of Encryption = “Two Way Encryption(With Secret Text)”

  • Select Key To Be Used While Encryption = ““저희가 사용할 secretKey”

입력하시면 Encrypted String에 값 나옵니다. 복사 하신다음

jasypt_use

application.yml에 저희 암호화 시킬 property에 모자이크 처리 되어있는 형식안에 적어주시고 돌리시면 배포시 복호화 되어 읽어집니다!

Jasypt Config


또 Config 에서는

@Configuration
public class JasyptConfig {

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(System.getProperty("jasypt.encryptor.password"));
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }

}
  • config.setPassword(System.getProperty(“jasypt.encryptor.password”)); : secretKey 설정

  • PBEWithMD5AndDES : MD5와 DES를 이용한 패스워드 기반 암호화

  • config.setPoolSize(“1”); : 암호화를 사용할 공간? 이라는데 숫자에 따라 암호화 사용 공간을 추가할 수 있다고 하네요 ( 메모리를 많이 잡아먹는다는 얘기가 있습니다.)

  • config.setIvGeneratorClassName(“org.jasypt.iv.NoIvGenerator”); : 암호화 시 초기값을 설정하는 부분이라고 들었는데 현재 org.jasypt.iv.randomivgenerator 방식을 사용하려니깐 String 파일을 bind 할 수 없다고 하네요 정상적으로 실행될 때 수정하겠습니다

Tomcat 외부변수 등록


이제 secretKey를 적용하려고 하는데 여러가지 방식이 있다. properties에 넣고 git ignore에 등록하는 방식, secretKey를 또 암호화 시켜 개발자들만 아는 방식 등이 있지만 저희는 Tomcat에 등록하여 다들 개발하기 편하게 작업할려고 합니다.

-Djasypt.encryptor.password="secretKey값" 이라고 커스텀 변수 설정하시고

jasypt_tomcat

위쪽 톰캣에 등록하시면 외부변수 읽어서 실행 시 읽게 될겁니다~ (단점은 테스트를 돌릴 때에 테스트에도 설정 변수를 입력해야 사용 가능하네요ㅠ)

잘못된 내용이 있으면 얘기해주세요 ~