HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
👩‍👩‍👦‍👦
[팀01] 김팽박이
/
🌝
What we learn
/
🪧
Jasypt 를 통한 정보 암호화
Jasypt 를 통한 정보 암호화
🪧

Jasypt 를 통한 정보 암호화

PERSON
STATUS
완료

Jasypt 를 통한 정보 암호화

2022/07/14

1. 포스팅 이유

github 에 정보를 올릴때 보안정보가 노출되는 경우를 방지하기 위해 Jasypt 를 통해 암호화 과정을 겪어보자

2. Jasypt 란?

  • Jasypt는 개발자가 암호화 작동 방식에 대한 깊은 지식 없이도 최소한의 노력으로 자신의 프로젝트에 기본 암호화 기능을 추가할 수 있도록 하는 Java 라이브러리입니다.
  • 정말 간단하게 라이브러리 추가, 암호화, key값 넘겨주기 세 가지 단계로 프로퍼티를 암호화하여 관리할 수 있다.

3. Jasypt 적용

dependency 추가

implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
  • 3.0.3 적용 시 도커활용 시 에러 발생 이슈가 존재한다. 3.0.4 버전 이상을 사용하자

Bean 등록

import org.jasypt.encryption.StringEncryptor; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JasyptConfig { @Value("${jasypt.encryptor.password}") private String password; @Bean("jasyptStringEncryptor") public StringEncryptor stringEncryptor() { 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"); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; } }
  • 위 코드와 같이 bean 등록 후 암호화에 사용되는 password 는 @Value 를 통해 yaml 에서 가져온다.

3. 프로퍼티 암호화

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
notion image
  • 위 사이트를 통해 암호화를 직접 진행 할 수 있다.
  • 암호화하고자 하는 값을 넣고, 'Two Way Encryption' 을 선택한 후 자신의 SecertKey 를 집어넣고 Encryption 버튼을 누르면 암호화된 결과가 나온다.
  • 암호화된 값을 Decryption 에 넣고 secret key 를 넣으면 다시 원래의 값을 얻을 수 있다.
security: oauth2: client: registration: naver: client-id: { client-id } client-secret: { secret } redirect-uri: <http://localhost:8080/login/oauth2/code/naver> authorization-grant-type: authorization_code security: oauth2: client: registration: naver: client-id: ENC(DNf1SeHYTxyyG9dJTGwSVAN8E3kXBTJUwD7nY2S7Ak8=) client-secret: ENC(+gIL8lfla1khvDTeN5iNH2/JeovNx6F2) redirect-uri: <http://localhost:8080/login/oauth2/code/naver> authorization-grant-type: authorization_code
  • 그 후 다음과 같이 기존의 보안 정보를 사이트에서 encrytion 을 통해 암호화된 값을 얻고
  • 그 값은 ENC 로 감싸서 입력시키면 된다.

4. Password 전달

  • password 값을 application.yaml 에 넣는다면 누구나 복호화할 수 있어 의미가 없어진다.
  • 그렇기 떄문에 직접 외부에서 전달하거나 혹은 password 를 숨겨주어야 한다.

환경변수 설정

  1. 환경변수로 ENC_KEY = customPassword 와 같이 키를 입력한 후 서버를 실행하면 된다.
  1. jasypt-1.9.2-dist.zip 을 압축해제 한다.
  1. 명령 프롬프트(cmd) 창을 열고, 압축 해제한 jasypt 폴더의 bin폴더로 경로를 설정한다.
cd C:\\Downloads\\jasypt-1.9.2-dist\\jasypt-1.9.2\\bin
  1. 암호화, 복호화
encrypt input=“암호화할 값” password=“키 값” algorithm=“적용할 암호화 알고리즘” 입력 (예 : encrypt input=“test“ password=“test“ algorithm=“PBEWITHMD5ANDDES“) decrypt input=“복호화할 값” password=“키 값” algorithm=“적용할 암호화 알고리즘” 입력 (예 : decrypt input=“MkeTNSesdm35edc2“ password=“test“ algorithm=“PBEWITHMD5ANDDES“)
  • 이부분은 추가적인 조사가 필요할거 같다.

private 한 레포지토리에 저장

yaml 파일을 github 의 submodule 에 적용시켜 권한이 있는 관리자만 접근할 수 있는곳에 보관한다.
jasypt: encryptor: bean: jasyptStringEncryptor password: password

도커로 실행 시 환경 변수 지정

docker run 실행시 환경변수를 지정하면 된다. sudo docker run -it --name 컨테이너이름 -d -e password=비밀번호 -p PORT:PORT 이미지명 Dockerfile 엔트리 포인트 구성 ENTRYPOINT ["java","-jar","-Djasypt.encryptor.password=비밀번호","./Jar파일이름.jar"]
 
자 이제 이 파일을 submodule 로 숨겨보자!!!

참고 사이트

https://emgc.tistory.com/137
https://devlifetestcase.tistory.com/9
https://kitty-geno.tistory.com/160
https://www.kurien.net/post/view/38
https://velog.io/@rnjsals1575/Jasypt를-사용한-민감정보-암호화