Spring에서 properties 또는, yaml 파일에 데이터베이스 접속 정보나, 다양한 설정 정보들을 담아두고 활용하고 있다.
properties 또는, yaml 파일이 외부로 노출이 되면 충분히 악의적으로 사용이 가능할 수 있다는 생각이 들어 파일의 정보를 암호화를 해보려고 한다.
Spring 암호화라는 키워드로 검색 하였을 때 Jasypt 라는 라이브러리가 자주 등장했다.
Jasypt에 대해 찾아보니 Java , Java + Spring , Java + 하이버네이트 등 여러 프레임 워크에서 암복호화를 지원해주는 오픈소스 라고한다.
간단히 얘기하자면 개발자가 암호화 작동 방식에 대한 깊은 지식 없이도 최소한의 노력으로 프로젝트에 기본 암호화 기능을 추가 할 수있는 Java 라이브러리이다.
먼저 암호화를 위해 jasypt 라이브러리를 추가해야한다.
<dependency>
<groupId>org.jasypt</groupId>
<artifactId>jasypt-spring31</artifactId>
<version>1.9.2</version>
</dependency>
context에 복호화를 위한 객체 3개를 bean으로 만들어준다.
<beans:bean id="encryptorConfig" class="org.jasypt.encryption.pbe.config.EnvironmentPBEConfig">
<beans:property name="algorithm" value="PBEWithMD5AndDES" />
<beans:property name="passwordEnvName" value="TEST_KEY" />
</beans:bean>
<beans:bean id="encryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<beans:property name="config" ref="encryptorConfig" />
</beans:bean>
<beans:bean class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
<beans:constructor-arg ref="encryptor" />
<beans:property name="locations">
<beans:list>
<beans:value>classpath:config/db-context-loc.properties</beans:value>
</beans:list>
</beans:property>
</beans:bean>
algorithm
암/복호화 알고리즘이다. 암호화 할 때 쓴 알고리즘 이름을 넣어야 한다. 위 예제에서 사용한 알고리즘은 PBEWithMD5AndDES 이다.passwordEnvName
암,복호화에 필요한 key password를 지정한 키 값이다.마지막 생성한 Been은 암호화 된 값들이 있는 .properties 파일의 위치를 설정한다.
properties 파일은 다음과 같이 생겼다.
db.driver=com.mysql.jdbc.Driver
db.url=ENC(dA5m1XXzMMqixudUjoPtve6hSrKnNgDnG6yXytBcnoSzPx46zNl32Q7y1gvI3jMB)
db.username=ENC(X3scraZNomhTtGD8QAndPw==)
db.password=ENC(eGaAQsn3ejXTMusZjl78sg==)
암호화 문자열 생성은 2가지 방법이 있다.
http://www.jasypt.org/download.html 로 가서 Jasypt 를 다운로드 받고 압축을 푼다.
해당 폴더의 /bin 으로 들어가 cmd 를 열고 아래와 같이 입력한다.
위의 algorithm 값은 bean을 만들 때 입력했던 부분과
동일해야 한다.
다운받고 하는 과정이 번거로우시면 아래와 같이 테스트코드 작성해서 구하면 된다.
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
standardPBEStringEncryptor.setAlgorithm("PBEWithMD5AndDES");
standardPBEStringEncryptor.setPassword("TEST_KEY");
String encodedPass = standardPBEStringEncryptor.encrypt("1q2w3e4r!!");
System.out.println("Encrypted Password for admin is : "+encodedPass);
매번 작업을 하면서 보안 정보들이 암호화되어 있지 않았던 부분이 마음에 걸렸지만, 이번 작업을 통하여 어느 정도 보안 되었다는 생각에 뿌듯하다.🧑