Java

Java Jasypt 프로퍼티 암호화

코드깎는머슴 2024. 9. 16. 10:40
728x90
반응형

Java Jasypt 프로퍼티 암호화

 

 

 

1. Jasypt란?

Jasypt는 개발자가 암호에 대한 지식 없이도

최소한의 노력을 통해 자신의 프로젝트에 기본적인 암호화 기능들을 추가할 수 있게 도와주는 라이브러리이다.

 

목록 분류에서도 알 수 있듯이 스프링 자체 기술은 아니고, 자바에서 지원해주는 기술이다.

스레드 안전의 특징을 가지기 때문에,

싱글톤 환경인 스프링에서 동기화에 대한 걱정 없이 사용할 수 있다.

 

아 물론 자바, 스프링, 스프링 부트에서 사용할 때 각각 설정이 조금씩 달라지기는 한다.

오늘은 스프링부트에서 사용하는 방식을 소개할 예정이다.

 

그리고 원본문자에 대한 제약이 없다.

일본어나 한국어 등 자주 사용되지 않는 언어를 지원해준다.

근데 뭐 대부분 영어로 쓸텐데 크게 와닿으려나 싶기는 하다.

 

아무튼 바로 코드로 알아보자.

 

 

 

2. 의존성 추가

implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5")

이름이 특이한데 아마 만드신 분의 이름을 따온 것 같다.

 

 

 

3. 설정 클래스 파일 생성

/** GitHub : https://github.com/ulisesbocchio/jasypt-spring-boot */
@Configuration
public class JasyptConfig {

  @Bean(name = "jasyptStringEncryptor")
  public StringEncryptor stringEncryptor() {
    String password = "around_hub_studio";
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

    SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    config.setPassword(password); // 암호화할 때 사용하는 키
    config.setAlgorithm("PBEWithMD5AndDES"); // 암호화 알고리즘
    config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
    config.setPoolSize("1"); // 인스턴스 pool
    config.setProviderName("SunJCE");
    config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스
    config.setStringOutputType("base64"); // 인코딩 방식

    encryptor.setConfig(config);
    return encryptor;
  }
}

예시 코드인데, config는 그냥 encryptor에 대한 설정을 위한 객체라고 생각하면 된다.

회수는 해싱 회수를 높게 설정해서 뭐 그만큼 꼬아서 만든다는 것 같다.

인스턴스 pool은 1로 설정해도 상관없다고 한다.

나도 암호화에 대한 지식이 별로 없어서 자세히는 모르겠는데 그냥 예시를 보고 잘 써봐야 할 것 같다.

 

 

 

4. 속성값 암호화

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

 

Jasypt Encryption and Decryption Online

Jasypt online free tool for encryption and decryption.This tool supports one way and two way password encryptor using Jasypt as well as matching encrypted password using Jasypt.

www.devglan.com

이건 암호화를 할 수 있는 사이트이다.

꼭 여기서 해야 하는 건 아니고, 직접 할 수도 있다.

 

직접 사용하는 예시

void encryptTest() {
  String id = "ddd";
  String password = "ddd";

  System.out.println(jasyptEncoding(id));
  System.out.println(jasyptEncoding(password));
}

public String jasyptEncoding(String value) {
  String key = "example";
  StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
  pbeEnc.setAlgorithm("PBEWithMD5AndDES");
  pbeEnc.setPassword(key);
  return pbeEnc.encrypt(value);
}

이건 테스트코드인데, 테스트 코드를 작성하고 실행하면 암호화된 값이 나온다.

그렇게 나온 값을 사용하면 된다.

 

 

 

5. application.properties 설정

datasource:
  driverClassName: org.mariadb.jdbc.Driver
  url: jdbc:mariadb://localhost:33066/
  username: ENC(LdsY1or+HixRvd/oLzeD0Q==)
  password: ENC(ocjxUpU0Aq6GM0WtxG9zhQEq7RlpTQey)

암호화된 속성값을 넣어준다.

값을 넣을 때 ENC()안에 넣어줘야 한다.

자동으로 안에 있는 값이 암호화된 값이라고 인지하고 복호화를 해준다.

그 다음에 설정파일에 있는 빈의 이름과 동일하게 속성을 지정해준다.

 

@Bean(name = "jasyptStringEncryptor")

이게 설정파일에 있던 빈의 이름

jasypt: # 프로퍼티 암호화 설정
  encryptor:
    bean: jasyptStringEncryptor

여기 넣어주면 된다.

 

그런데 사실 이렇게 공개된 장소에 값을 가져다 놓으면,

누구나 복호화할 수 있기 때문에 그렇게 좋은 방법은 아니라고 한다.

그래서 환경변수로 등록해서 재부팅을 해줘야 한다.

 

지금 설정 창에서 환경변수 등록하는게 안보이는 사람들이 있을텐데,

Modify options > operationg System > Environment variables를 누르면 나온다.

 

이제 여기에 + 버튼을 누르고 등록해주면 된다.

이제 사용법은 전부 알아봤다.

 

근데 이거 공부하면서 제일 궁금했던건데 Jasypt는 어떻게 읽는 거지? 자시프트?

728x90
반응형