본문으로 바로가기

목차

    0. 환경

    • windows10
    • openjdk version "1.8.0_242"
    • STS4 TooL (이클립스) 
    • Spring Framework 4.3.8 released
    • Spring MVC Project (Legacy Project) 

    1. maven 추가 (pom.xml)

    • jasypt-spring31
    <!-- https://mvnrepository.com/artifact/org.jasypt/jasypt-spring4 -->
    <dependency>
    	<groupId>org.jasypt</groupId>
    	<artifactId>jasypt-spring31</artifactId>
    	<version>1.9.2</version>
    </dependency>

    2. 암호화할 부분

    [변경 전]

    <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
    <property name="jdbcUrl" value="jdbc:log4jdbc:mysql://127.0.0.1:3306?useSSL=false&amp;serverTimezone=UTC" />
    <property name="username" value="user" /> 
    <property name="password" value="password" />

     

    [변경 후]

    • username과 password가 직접 노출이 되지 않는 것을 확인할 수 있습니다.
    • .properties 파일을 이용해 정보를 따로 관리합니다.
    <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
    <property name="jdbcUrl" value="jdbc:log4jdbc:mysql://127.0.0.1:3306?useSSL=false&amp;serverTimezone=UTC" />
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" />
    #.properties file
    #db(test Server)
    jdbc.username=ENC(9k4SKcvQYus9RbBiN7PENQ==)
    jdbc.password=ENC(O4QjSLwv5uTABGZSMOu+ohB6dMj0ad1Q)

    3. 암호화 테스트

    • jasypt가 잘 동작하는지 다음 소스로 확인해 봅니다.
    • 다음 소스를 활용해 암호화를 할 것입니다.

    [테스트 소스]

    package com.kamp.util;
    
    import java.io.IOException;
    
    import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
    import org.jasypt.registry.AlgorithmRegistry;
    import org.jasypt.salt.StringFixedSaltGenerator;
    import org.junit.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.kamp.quartz.TestQuartzService;
    
    public class JasyptTest {
    
        private static final Logger logger = LoggerFactory.getLogger(JasyptTest.class);
    
        public static void jastypt(String str) {
            StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
            
            encryptor.setAlgorithm("PBEWITHMD5ANDTRIPLEDES");
            encryptor.setPassword("test_password");
            
            //ADD Salt
            //saltGenerator를 지정하지 않으면 RandomSaltGenerator를 default로 사용합니다. 
            //random salt를 사용하는 경우는 암호화된 결과 값이 매번 바뀌므로 권장합니다 
            //encryptor.setSaltGenerator(new StringFixedSaltGenerator("someFixedSalt"));
    
            String encryption = encryptor.encrypt(str);
            String decryption = encryptor.decrypt(encryption);
            
            System.out.println("암호화: " + encryption);
            System.out.println("복호화: " + decryption);
        }
        
        public static void main(String[] args) throws IOException, InterruptedException {
            jastypt("veneas");
    
            //사용 가능한 알고리즘
            logger.info("allDigestAlgorithms : {}", AlgorithmRegistry.getAllDigestAlgorithms()); 
            logger.info("allPBEAlgorithms : {}", AlgorithmRegistry.getAllPBEAlgorithms()); 
        }
    	
    }

    [실행 결과]

    암호화: yEbU168pBDcd18hL6yBVPg==
    복호화: veneas
    
    사용 가능한 알고리즘
    allDigestAlgorithms : [MD2, MD5, SHA, SHA-224, SHA-256, SHA-384, SHA-512]
    allPBEAlgorithms : [PBEWITHHMACSHA1ANDAES_128, PBEWITHHMACSHA1ANDAES_256, PBEWITHHMACSHA224ANDAES_128, PBEWITHHMACSHA224ANDAES_256, PBEWITHHMACSHA256ANDAES_128, PBEWITHHMACSHA256ANDAES_256, PBEWITHHMACSHA384ANDAES_128, PBEWITHHMACSHA384ANDAES_256, PBEWITHHMACSHA512ANDAES_128, PBEWITHHMACSHA512ANDAES_256, PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_128, PBEWITHSHA1ANDRC2_40, PBEWITHSHA1ANDRC4_128, PBEWITHSHA1ANDRC4_40]

    4. root-context.xml (자바 bean 설정)

    <!-- Jasypt Start -->
    	<bean id="encryptorConfig" class="org.jasypt.encryption.pbe.config.EnvironmentPBEConfig">
    		<!-- 사용할 암호화 알고리즘 -->
    		<property name="algorithm" value="PBEWithMD5AndDES" />
    		<!-- PBE (패스워드 기반 암호화) 암호 설정-->
    	    <property name="password" value="test_password" /> 
    	</bean>  	
    	
    	<bean id="encryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">  
    		<property name="config" ref="encryptorConfig" />  
    	</bean>  
    	 
    	<bean class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
    		<constructor-arg ref="encryptor" />
    		<property name="locations">
    			<list>
    				<!-- application.properties 파일 경로 -->
    				<value>classpath:/application.properties</value>
    			</list>
    		</property>
    	</bean>		
    <!-- Jasypt End -->

    5. application.properties (.properties 파일 생성)

    • 위에서 설정한 경로에 맞게 application.properties 생성합니다. (src/main/resources/application.properties)
    • root-context.xml 에 설정한 내용과 3번에서 사용한 소스를 활용하여 내용을 입력해줍니다.
    • 형식은 다음과 같고 ENC로 감싸주면 복호화를 해줍니다.
      • 형식: ENC(암호화된 값)
    #db(test Server)
    jdbc.username=ENC(9k4SKcvQYus9RbBiN7PENQ==)
    jdbc.password=ENC(O4QjSLwv5uTABGZSMOu+ohB6dMj0ad1Q)

    6. DB 연결 정보 수정

    • root-context.xml에 저장된 DB 정보인 username과 password를 다음과 같은 형태로 applcation.properties 파일 내용을 바라보도록 변경해주면 끝입니다.
    <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
    <property name="jdbcUrl" value="jdbc:log4jdbc:mysql://127.0.0.1:3306?useSSL=false&amp;serverTimezone=UTC" />
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" />