일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- db
- 널포인터에러
- ansible
- 중복제거
- mybatis
- 리스트교집합
- awsconsole
- 지옥같은git
- Spring
- anymatch메서드
- PostgreSQL
- route53
- WordPress
- string_agg()
- AWS
- 3tierarchitecture
- 리스트비교
- list중복제거
- enum
- 권한정책
- 두개리스트비교
- lightsail
- 리스트차집합
- Java
- hashset
- instance생성
- enumtype
- Annotation
- 리스트합집합
- wordpress블로그
- Today
- Total
Anyway
[Spring] Jasypt로 프로퍼티 암호화하기 본문
단순히 코드 저장을 위해 Github에 코드를 올린다 하지만 아무래도 DB user나 pw같은 유출 가능성이 있는 키나 개인 정보들은 암호화해주는 게 좋다. 더군다나 실무에서 이런 키들이 저장소에 올라가게 되면 어떤 일이 일어날지 모른다... 😌 이번에 진행중인 프로젝트 내에서 프로퍼티 암호화를 위해 Jasypt를 처음 써보게 되어 정리한다.
[Jasypt란?]
Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and without the need of having deep knowledge on how cryptography works.
출처 : 공식 http://www.jasypt.org/
Jasypt 공식 문서를 참고한 바 Jasypt는 개발자가 최소한의 노력으로 자신의 프로젝트에 기본적인 암호화 기능을 추가할 수 있게 해주는 Java 라이브러리이며, 암호화가 작동하는 방식에 대한 심층적인 지식이 없어도 된다고 한다.
실제로 적용해보자.
💁🏻♀️암호화하고 싶은 부분
노란색 박스 친 부분으로
- Database url
- Database username
- Database password
- jwt-secret
이 네 가지를 암호화하고 싶었다.
1️⃣ 라이브러리 추가
현재 프로젝트 내에선 maven으로 개발 중이었기에 pom.xml에 dependency를 추가해줬다.
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
2️⃣ 프로퍼티를 암호화하여 출력
암호화 하고자 하는 프로퍼티 값을 암호화 하는 과정으로 > run을 하여 암호화된 값을 받기 위한 것이 목적이다.
git에 올릴 땐 지우고 올려줘야 한다. 그대로 올려버리게 되면 이것을 암호화 한 의미가 없어지게 된다.
public class JasyptUtilMain {
public static void main(String[] args){
String localKey = "WdkIEsdkPd"; //랜덤 변수
String stgKey = "sLEFdckssF";
String prdKey = "EIsdkcSDfe";
String enpass = "{암호화 할 변수}";
System.out.println("* local ---------------------------------------------------->");
printKey(localKey, enpass);
System.out.println("* stg ------------------------------------------------------>");
printKey(stgKey, enpass);
System.out.println("* prd ------------------------------------------------------>");
printKey(prdKey, enpass);
}
private static void printKey(String key, String enpass){
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setAlgorithm("PBEWithMD5AndDES");
encryptor.setPassword(key);
encryptor.setKeyObtentionIterations(1000);
encryptor.setIvGenerator(new RandomIvGenerator());
encryptor.setSaltGenerator(new RandomSaltGenerator());
encryptor.setStringOutputType("base64");
String encryptStr = encryptor.encrypt(enpass);
System.out.println("> 텍스트 -> [" + enpass + "]");
System.out.println("> key -> [" + key + "]");
System.out.println("> 암호화 -> ENC(" + encryptStr + ")");
System.out.println("> 복호화 -> [" + encryptor.decrypt(encryptStr) + "]");
}
}
- 서로 다른 세 가지 환경에서 쓸 거라 key를 local, stg, prd로 나눴으며 이 key는 유출돼서도 잃어버려서도 안 된다 !!
- 각각의 환경에서 암호화 할 {변수}인 enpass
만약 username을 암호화하고 싶어 enpass 값에 username을 넣고 코드를 돌리게 되면
암호화 키가 ENC(~) 형태로 나오게 된다. 실제 프로퍼티가 쓰여져야 하는 곳에 이 ENC(~) 값을 넣어주면 된다.
3️⃣ 프로퍼티 수정
각각의 키의 암호화 과정을 마쳤으면 그 암호화 키(ENC(~))를 프로퍼티에 넣어준다.
spring:
datasource:
url: ENC(/NqesvJNUZWjE4AwadpTzF7DneGem8Up1F+sdj+vg3qS/VEwBq+OHgzKsFeCcJQ9oVsjbave4U4=)
driver-class-name: org.postgresql.Driver
username: ENC(7nwsurvoUPBzbhJnaPjgIIQ0mwpoOg39)
password: ENC(7nwsurvoUPBzbhJnaPjgIIQ0mwpoOg39)
sbproject:
jwt-secret: ENC(HYLzRM8mENqzHEIg8cGCJAn1KF7lIenAEFcl0gCAP7peRLOKtbAZCHBDBMND9lU4DCFmPu7aoEpdNNisjUcktWmFrM112tohfeK8YIetumrF1fFJgTR2+g==)
4️⃣ application.yaml에 Jasypt 추가
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
password: ${jasypt.encryptor.password}
5️⃣ Configuration에 VM option 추가
Add VM options를 눌러 생긴 박스에 -Djasypt.encryptor.password={암호키} 값을 넣어주면
이 암호키를 가지고 ENC(~) 값을 복호화 한 값이 실제 프로퍼티에 들어가게 되는 것이다.
{암호키}를 환경변수에 설정할 수도 있다.
'Java > Spring' 카테고리의 다른 글
[JAVA] 두 개의 리스트에서 중복 값 제거 HashSet 사용하기 (0) | 2025.01.03 |
---|---|
[Spring] 스테레오 어노테이션(Stereotype Annotation) (0) | 2024.08.29 |
[Spring] @RequestBody가 쓰이지 않는 경우 (0) | 2024.08.28 |
[Spring] @RequestBody 사용하기 (0) | 2024.08.28 |
[Spring] 정적 팩토리 메서드 패턴 (0) | 2024.08.27 |