Jasypt (Java Simplified Encryption)를 이용하여 properties 파일암호화하기 (DB 접속정보암호화)

2tsumo·2022년 5월 30일
0

java

목록 보기
2/6

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>
profile
👨‍💻

0개의 댓글