Spring에서 properties 또는, yaml 파일에 데이터베이스 접속 정보나, 다양한 설정 정보들을 담아두고 활용하고 있다.
properties 또는, yaml 파일이 외부로 노출이 되면 충분히 악의적으로 사용이 가능할 수 있으므로 파일의 정보를 암호화해야한다.
Jasypt (Java Simplified Encryption)를 이용하여 properties 파일 암호화하기
※Jasypt는 개발자가 암호화 작동 방식에 대한 깊은 지식 없이도 최소한의 노력으로 자신의 프로젝트에 기본 암호화 기능을 추가할 수 있도록 하는 Java 라이브러리
※Jasypt 특징
-단방향 및 양방향 암호화 기술로 높은 보안을 제공해준다.
-비밀번호, 텍스트, 숫자, 바이너리 등을 암호화 할 수 있다.
-Spring Security와 Hibernate와도 연동이 가능하다.
-스레드로 부터 안전하기 때문에 Spring과 같은 싱글톤 지향 환경에서 동기화 걱정 없이 사용할 수 있다.
(1) pom.xml 수정
maven에서 해당 라이브러리를 검색해서 추가해주었다
<!-- https://mvnrepository.com/artifact/org.jasypt/jasypt-spring31 -->
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt-spring31</artifactId>
<version>1.9.3</version>
</dependency>
(2) context-datasource.xml 수정
<bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWithMD5AndDES" />
</bean>
<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config" ref="environmentVariablesConfiguration" />
<property name="password" value="I_LOVE_SHERLOCKID" />
</bean>
<bean id="propertyConfigurer" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg ref="configurationEncryptor" />
<property name="locations">
<list>
<value>classpath:/prop/globals.properties</value>
</list>
</property>
</bean>
3개의 bean을 등록해주었다.
첫번째 -> 암호화에 사용될 알고리즘을 PBEWithMD5AndDES을 쓰겠다는 설정
두번째 -> 암 복호화에 필요한 키값. 패스워드라 되어있지만 실제 패스워드가 아닌 키를 뜻함. 이 값과 실제 암호화 하고자 하는 값을 둘다 알아야 복호화를 할 수 있음
세번째 -> 암호화를 진행할 path 설정
(3) 암호화를 위한 java class 파일 생성 -> JasyptUtil
실제 암호화된 값을 구하기 위해서 Util에 프로그램을 하나 만들어서 넣어놓았다.
public class JasyptUtil {
public static void main(String[] args) {
StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
pbeEnc.setAlgorithm("PBEWithMD5AndDES");
pbeEnc.setPassword("I_LOVE_SHERLOCKID");
String url = pbeEnc.encrypt("url");
String username = pbeEnc.encrypt("name");
String password = pbeEnc.encrypt("pw");
System.out.println(url);
System.out.println(username);
System.out.println(password);
}}
위와 같이 원하는 문자열을 암호화 시킬 자바 클래스를 생성해준다. 이 클래스를 실행하면 자신이 입력한 문자열이 암호화 된 문자열로 나오는 것을 볼 수 있다.
콘솔창에서 암호화 된 문자열을 복사하여 메모장 같은 곳에 기록해둔다.
setPassword는 암호화 & 복호화에 이용될 키값이다. 2번 XML 파일 수정에서 configurationEncryptor Bean의 property 중에 “password”가 있는데 이 값과 같은 값이 되어야 한다.
ex) String password = pbeEnc.encrypt("sherlockid_##");
(4) globals.properties 파일 수정
Globals.UserName=ENC(TGqHsKnvPTyS7Hi5nvy5QA==)
Globals.Password=ENC(gwT9ObRgqSB5zwnu8D1GnQ==)
Globals.Url=ENC(s4/ER13Q0MisMeD6nTQiRb2O9ViyJDwmlMbp3DJrVJX2lfSwBRCs6a22OhIV+61I7NnoLKGOays=)
ENC 안에 위에서 구한 암호화된 값을 넣어주면 된다.
(5) context-datasource.xml 에서 globals.properties 값 가져오기
<bean id="dataSource-postgresql" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${Globals.DriverClassName}"/>
<property name="url" value="${Globals.Url}"/>
<property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/>
</bean>