DEV/Spring

[Spring] Jasypt 프로퍼티스 암호화

Imvory 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>