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>