ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Jasypt 프로퍼티스 암호화
    DEV/Spring 2022. 9. 20. 11:30

    프로젝트 중 프로퍼티스 암호화가 필요하여 적용해보았다.

    잊기전에 정리.

     

    pom.xml 에 해당 라이브러리 사용을 위해 추가

    <dependency>
        <groupId>org.jasypt</groupId>
        <artifactId>jasypt-spring31</artifactId>
        <version>1.9.3</version>
    </dependency>

     

    db-context.xml 에 추가

    <beans:bean class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
        <beans:constructor-arg ref="encryptor"/>	
        <beans:property name="locations">
            <beans:list>
                <beans:value>classpath:properties/dbconnect.properties</beans:value>
            </beans:list>
        </beans:property>
    </beans:bean>
    
    <beans:bean id="encryptorConfig" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
        <beans:property name="algorithm" value="PBEWithMD5AndDES"/>
        <beans:property name="password" value="testKey"/>
    </beans:bean>
    
    <beans:bean id="encryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
        <beans:property name="config" ref="encryptorConfig"/>
    </beans:bean>

    2번째  bean encryptorConfig에서

    algorithm은 PBEWithMD5AndDES

    password에는 실제 패스워드가 아닌 Key값을 넣어준다.

     

    여기서 해당 key 값도 프로퍼티스에서 가져오는 방식을 사용하고싶었지만 뜻대로 되지않았다..

    혹시 방법이나 안되는 이유를 알고 계신분은 댓글 남겨주시면 감사하겠습니다. 

     

    @ResponseBody
    @RequestMapping(value="/encrypt.do", method= RequestMethod.POST)
    public Map<String, Object> encrypt(@RequestParam Map<String, Object> map, HttpServletRequest request) {
    
        Map<String, Object> rtnMap = new HashMap<String, Object>();
        try {
    
            StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
            standardPBEStringEncryptor.setAlgorithm("PBEWithMD5AndDES");
            standardPBEStringEncryptor.setPassword(map.get("key").toString());
            String encryptedPass = standardPBEStringEncryptor.encrypt(map.get("password").toString());
            System.out.println("Encrypted Password is ====> "+encryptedPass);
    
            rtnMap.put("status", "SUCCESS");
            rtnMap.put("encryptedPass", encryptedPass);
    
        } catch (Exception e) {
            rtnMap.clear();
    
            rtnMap.put("status", "ERROR");
            rtnMap.put("msg"   , e.getMessage());
        }
    
        return rtnMap;
    }

    나는 다음과같이 사용자가 화면에서 key와 password 입력시 암호화된 password를 받아서 사용할 수 있도록 했다.

    간단하게 setAlgorithm()과 setPassword() 만 사용했지만 다른 설정도 많으니 찾아보는것을 추천.

     

    여기서 입력받은 key값은 db-context.xml 에 password property에 넣어주고,

    encryptedPass 값은 사용하고 있는 db properties에 ENC()로 감싸서 사용하면 된다.

     

    ex)

    jdbc.password=ENC(fmfwPDQtsyKsVgkM/aEZ5g==)

     

    끗.

     

    마지막으로 사용자 화면 필요하신분들을 위해 .. 일부 발췌

    <body>
      <form id="encForm" name="encForm">
      <h3>암호화 문자열 생성기</h3>
    	KEY : <input type="text" name="key"><br/>
        암호화할 값 : <input type="text" name="password"/><br/>
      </form>
        <input type="button" value="인크립트" onclick="Encryption();"><br/>
        <textarea id="result" rows="12" cols="70"></textarea>
    
    <script type="text/javascript">
    function Encryption() {
    	$.ajax({
    		url: "/encrypt.do",
    		data: $('#encForm').serialize() ,
    		type: "POST",
    		success: function() {
    		},
    		complete: function(xhr, data) {
    			var result = JSON.parse(xhr.responseText);
    			
    			if(result.status == "SUCCESS") {
    				$("#result").val(result.encryptedPass);
    			}else{
    				alert("암호화중 오류가 발생했습니다.");
    				console.log(result.msg);
    			}
    		}
    	});
    }
    </script>
    </body>

    댓글

Designed by Tistory.