티스토리 뷰

반응형

테스트 환경

- Spring 4.3.18

- JDK 1.8

- Tomcat 8.0

- MySQL 8.0




Step 0. 준비사항


- DB연동이 완료된 Spring 프로젝트가 필요합니다.

  * http://its-easy.tistory.com/15 참고




Step 1. pom.xml에 관련 라이브러리 추가


1
2
3
4
5
6
        <!-- Jasypt -->    
        <dependency>
            <groupId>org.jasypt</groupId>
            <artifactId>jasypt-spring31</artifactId>
            <version>1.9.2</version>
        </dependency>
cs

현재 최신버전인 1.9.2 버전은 Spring 3.1 이상 JDK 1.6 이상을 요구합니다.

* 다른 버전을 사용할 경우 http://www.jasypt.org 에서 요구사항 확인 필요




Step 2. jasypt 암복호화 배치파일 다운로드 후 DB정보 암호화 문자열 확인


http://www.jasypt.org/download.html

위 사이트에서 다운로드 후 압축해제 합니다.

압축해제 후 bin폴더에 들어가면 여러 파일들이 보입니다.

아래 각 파일들에 대한 설명과 사용법입니다.

* 윈도우는 명령프롬프트에서 확장자가 bat인 파일을 사용하면 되고, 리눅스는 확장자가 sh인 파일을 사용하면 됩니다.


각 캡쳐 화면의 첫번째 줄이 명령어 입니다.


- listAlgorithms

사용 가능한 암호화 알고리즘 리스트를 보여줌


- digest

입력한 값과 알고리즘으로 암호화 한 문자열을 보여줌(DIGEST ALGORITHMS만 가능)

* input은 암호화 할 문자열을 입력하면 되고, algorithm은 listAlgoritms 명령어로 조회 한 DIGEST ALGORITHMS 중 하나를 입력하면 됨


- encrypt

입력한 값과 알고리즘으로 암호화 한 문자열을 보여줌(PBE ALGORITHMS만 가능)

* input은 암호화 할 문자열을 입력하면 되고, password는 사용자가 원하는 키값을 아무거나 입력하면 되고, algorithm은 listAlgoritms 명령어로 조회 한 PBE ALGORITHMS 중 하나를 입력하면 됨


- decrypt

입력한 값과 알고리즘으로 복호화 한 문자열을 보여줌(PBE ALGORITHMS만 가능)

* input은 복호화 할 문자열을 입력하면 되고, password와 algorithm은 암호화 시 입력했던 정보를 입력하면 됨


※ 명령 프롬프트에서 복사/붙여넣기 하는 방법

복사 : 우클릭 후 모두선택 클릭 - 우클릭 하면 전체 문자열이 복사됨(메모장에 붙여넣기 해서 원하는 문자열만 잘라내기하면 됨)

붙여넣기 : Ctrl + V하면 안되고, 우클릭 후 붙여넣기 하면 됨




Step 3. properties 파일 생성


1
2
3
4
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=ENC(암호화 한 문자열)
jdbc.username=ENC(암호화 한 문자열)
jdbc.password=ENC(암호화 한 문자열)
cs

한가지 유의할 점은 driverClassName를 암호화 하면 Context initialization failed 에러가 발생하면서 Tomcat이 구동되지 않습니다. 

암호화를 원하는 값만 ENC로 묶어주고, 원하지 않는 값은 평문으로 해주시면 됩니다.




Step 4. root-context.xml에 Jasypt 설정 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <!-- Jasypt -->
    <bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
        <property name="algorithm" value="PBEWITHMD5ANDDES"/>
<!--         <property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD"/> -->
        <property name="password" value="test"/>
    </bean>    
    <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
        <property name="config" ref="environmentVariablesConfiguration"/>
    </bean>    
    <bean id="propertyConfig" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
        <constructor-arg ref="configurationEncryptor"/>
        <property name="location" value="classpath:globals.properties"/>
    </bean>    
    
    <!-- DataSource -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
        <property name="driverClassName" value="${jdbc.driverClassName}"/
        <property name="url" value="${jdbc.url}"/
        <property name="username" value="${jdbc.username}"/
        <property name="password" value="${jdbc.password}"/>
    </bean>
cs

굳이 하나하나 이해하려고 할 필요는 없고, 핵심적인 프로퍼티에 대해서만 살펴보도록 하겠습니다.


3라인의 algorithm은 암호화 알고리즘을 선택하는 속성입니다.

Step 2에서 DB정보를 암호화 한 문자열을 확인 할 때 입력했던 algorithm값을 그대로 입력해야 합니다.


5라인은 Step 2에서 DB정보를 암호화 한 문자열을 확인 할 때 입력했던 password값을 그대로 입력해야 합니다.


12라인은 Step 3에서 생성한 properties 파일의 위치를 지정해준 것입니다.

* classpath는 프로젝트 우클릭 - Deployment Assembly에서 확인 할 수 있습니다. classpath를 사용하지 않고, 직접 전체경로를 지정해줘도 괜찮습니다. 잘 모르겠으면 src/main/resources폴더에 properties를 생성한 후 위 예제같이 하시면 됩니다.


16~21라인을 보면 각 속성의 값을 직접 입력한 것이 아니라 properties파일의 키값으로 지정해 준 것을 알 수 있습니다.


여기까지 완료 되었다면 테스트를 한번 해보시기 바랍니다. 정상적으로 DB에 접속되는 것을 확인 할 수 있을 것입니다.

뭔가가 잘못 되었다면 Tomcat 기동에 실패하고, console창에 에러메시지가 보일 것입니다.




Step 5. 키값이 저장된 환경변수 추가


Step 4까지만 해도 기능 상에는 문제가 없지만 root-context파일에 암호화 키값이 노출되어 있는 문제가 여전히 남아 있습니다. 이 문제를 해결하기 위해서는 root-context파일을 아래와 같이 수정해줍니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <!-- Jasypt -->
    <bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
        <property name="algorithm" value="PBEWITHMD5ANDDES"/>
        <property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD"/>
<!--         <property name="password" value="test"/> -->
    </bean>    
    <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
        <property name="config" ref="environmentVariablesConfiguration"/>
    </bean>    
    <bean id="propertyConfig" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
        <constructor-arg ref="configurationEncryptor"/>
        <property name="location" value="classpath:globals.properties"/>
    </bean>    
    
    <!-- DataSource -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
        <property name="driverClassName" value="${jdbc.driverClassName}"/
        <property name="url" value="${jdbc.url}"/
        <property name="username" value="${jdbc.username}"/
        <property name="password" value="${jdbc.password}"/>
    </bean>
cs

Step 4와 비교해서 변경된 부분은 4라인의 주석이 해제되고, 5라인이 주석 처리된 부분 뿐입니다.

4라인의 value는 키값이 저장된 환경변수명입니다.


프로젝트가 서버에 올라와 있다면 환경변수명을 4라인 value값과 같게 생성하고, 값에는 Step 2에서 입력한 password 값을 넣어주고 난 뒤 Tomcat을 재시작하면 정상적으로 동작하는 것을 확인 할 수 있습니다.


주의할 점은 Eclipse에서는 윈도우의 환경변수를 읽어오지 못한다는 것입니다.

아래와 같이 해줘야 Eclipse에서 환경변수를 읽어오는 것이 가능해집니다.

Run - Run Configurations - 현재 사용중인 Tomcat 선택 - Environment탭 클릭 - 환경변수 추가


Tag : spring properties 암호화

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함