Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Kim ByeungHyun

JASYPT 본문

카테고리 없음

JASYPT

sandbackend 2022. 11. 27. 02:55

jasypt란? 

jasypt는 개발자가 암호화 작동 방식에 대한깊은 지식 없이도 최소한의 노력으로 자신의 프로젝트에 

기본 암호화 기능을 추가할 수 있도록 하는 Java라이브러리입니다.
  정말 간단히 라이브러리 추가,암호화,key값 넘겨주기 세가지 단계로 프로퍼티를 암호화하여 관리할수있다.

 

1. 라이브러르 추가 - gradle의 의존성을 추가해준다.

//githubignore jasypt
implementation group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '3.0.4'

2. 기본설정 - 나만의 Key를 사용해서 Bean을 등록하는 기본 설정이다.

https://github.com/ulisesbocchio/jasypt-spring-boot#use-you-own-custom-encryptor

@Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("password");
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }

 

3. 프로퍼티 암호화

1)사이트에서 암호화

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

2)테스트코드를 이용한 암호화 

@SpringBootTest
public class GodchoiceApplicationTest {

    @Test
    void contextLoads() {
    }

    @Test
    void jasypt() {
// String url = "imageputbucket";
        String a ="AKIAWQWYEWRCVKCZCEMO";
        String b="SHDL61UN3WZDORUYsZXUoQBhJfAUMtoMA2sdG0al";


        System.out.println("안뇽");
// System.out.println(jasyptEncoding(url));
        System.out.println(jasyptEncoding(a));
        System.out.println(jasyptEncoding(b));
    }

    public String jasyptEncoding(String value) {

        String key = "my_jasypt_key";
        StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
        pbeEnc.setAlgorithm("PBEWithMD5AndDES");
        pbeEnc.setPassword(key);
        return pbeEnc.encrypt(value);
    }
}


4. Password 전달

제일 중요한 부분이다.

Password값을 application.yml에 넣는다면 누구나 복호화할 수 있게 되므로 의미가 없어진다.

그렇기 때문에 직접 외부에서 전달해주어야 한다.

  • java -jar 명령어로 어플리케이션 실행 시 전달
--jasypt.encryptor.password=testkey

java명령어를 사용해 어플리케이션을 실행하는 경우엔 맨 마지막에 -- 를 사용하여 패스워드를 전달해준다.

'--' 앞의 jasypt.encryptor.password 는 '2. 기본설정' 에서 @Value 안에 넣어준 값과 동일해야 한다.

  • gradle에서 build 시 test의 프로퍼티로 전달

gradle에서 build를 진행하게되면 기본적으로 test도 같이 실행된다.

이때 암호화를 이용하여 같이 테스트를 하려 한다면 build 실행 시 Password를 함께 전달해주어야 한다.

-Pjasypt.encryptor.password=testkey

우선 build명령어 실행 시 -P를 사용하여 gradle의 환경변수로 넘겨준다.

test {
    useJUnitPlatform()
    systemProperty 'jasypt.encryptor.password', findProperty("jasypt.encryptor.password")
}

systemProperty는 키, 값 쌍을 인자로 테스트 수행 JVM의 시스템 프라퍼티 지정하는 메소드이다.

findProperty를 통해 '-P' 이하로 입력된 속성을 찾아서 JVM의 시스템 프로퍼티로 지정해준다.

위와 같이 사용하면 public repository에서도 application.yml을 안전하게 보관할 수 있다.