보안
[보안] Jasypt를 이용한 민감정보 암호화(SHA512)
yyyyMMdd
2025. 5. 15. 10:51
728x90
#. SHA256 알고리즘 적용
- MD5 알고리즘은 보안에 취약할 수 있습니다.
- 따라서 SHA256 이상의 알고리즘으로 변경해야하는데 이에 따라 적용해야하는 내용을 정리합니다.
#. JASYPT를 이용한 알고리즘 변경
- 암호화
- MD5 적용 시와는 다르게 세부적인 옵션까지 작성해줘야 합니다.
encrypt input="test" password="ene" algorithm="PBEWITHHMACSHA256ANDAES_256" keyObtentionIterations="1000" saltGeneratorClassName="org.jasypt.salt.RandomSaltGenerator" providerName="SunJCE" stringOutputType="base64" ivGeneratorClassName="org.jasypt.iv.RandomIvGenerator"
- 복호화
- 암호화와 마찬가지로 세부 옵션을 작성해줍니다.
decrypt input="G+NxyGswhGWSiTb0TE6dvz6bF8zMJ2QOrxiXeM/Drqze2DZPg8kzISbefW/1t/dM7q8bPUwyljcSnnvpHAKeYuX+kX7nguO8CctLg3MJZAfWRBu3+8p8eeQakRWKIN3I" password="ene" algorithm="PBEWITHHMACSHA256ANDAES_256" keyObtentionIterations="1000" saltGeneratorClassName="org.jasypt.salt.RandomSaltGenerator" providerName="SunJCE" stringOutputType="base64" ivGeneratorClassName="org.jasypt.iv.RandomIvGenerator"
#. 시스템에 적용하기
- 위와 같이 생성한 암호화 정보를 db.properties 라는 db정보를 담은 파일에 입력해줍니다.
- 이후 서버 기동을 하면 아래와 같은 메시지의 오류가 발생하는 경우가 있습니다.
- Java에서 Jasypt로 암호화 또는 복호화 작업을 수행할 때 발생하는 오류 메시지이며 이를 보면 강력한 암호화 알고리즘을 사용 중이나 현재 JVM에 무제한 강도 암호화 정책 파일(JCE Unlimited Strength Jurisdiction Policy Files)이 설치되지 않았기 때문이라고 합니다.
(Java1.8 사용중이며 Java9부터는 해당 정책이 활성화 되어 있습니다.) - 이 문제를 해결하기 위해선 아래의 웹사이트로 접속하여 JCE를 다운로드 합니다.
https://www.oracle.com/java/technologies/javase-jce8-downloads.html
JCE Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 Download
www.oracle.com
- 다운로드 후 압축을 풀어 아래 파일들을 Java 폴더 내 경로로 옮겨줍니다.
- 또한 이전에 만든 bean과 복호화 로직도 수정해줘야 합니다.
- 암호화할 때 입력한 세부옵션들을 작성해주어야 합니다.
<bean id="propertyConfigurer" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg ref="configurationEncryptor" />
<property name="location" value="classpath:config/dbConfig.properties" />
</bean>
<bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWITHHMACSHA256ANDAES_256"/>
<property name="providerName" value="SunJCE"/>
<property name="keyObtentionIterations" value="1000"/>
<property name="ivGeneratorClassName" value="org.jasypt.iv.RandomIvGenerator"/>
<property name="saltGeneratorClassName" value="org.jasypt.salt.RandomSaltGenerator"/>
<property name="passwordEnvName" value="JASYPT_PASSWORD"/>
</bean>
<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config" ref="environmentVariablesConfiguration"/>
</bean>
public static String decryptDbProperty(String key, String pw) {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(pw);
config.setAlgorithm("PBEWITHHMACSHA256ANDAES_256");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
if(key.startsWith("ENC(") && key.endsWith(")")) {
key = key.substring(4, key.length() -1);
}
return encryptor.decrypt(key);
}
#. 암호화와 복호화 시 알고리즘이 다른 경우
- null을 리턴하게 되어 아래와 같이 EncryptionOperationNotPossibleException이 발생하니 참고해주세요.
===========================================================
틀린 내용이 있거나 이견 있으시면 언제든 가감 없이 말씀 부탁드립니다!
===========================================================
728x90