개발 중 대칭키로 암호화해야할 상황이 생겼는데(DESede/CBC, DES/CBC, AES/CBC 등의 알고리즘 이용), 192 혹은 256 bit의 대칭키를 이용하여 암호화를 할 경우 에러가 발생했다.
java.security.InvalidKeyException: Illegal key size
원인을 찾아보니 Java는 기본적으로 JCE 정책을 제공하는데 이 정책은 미국의 정책에 따라 128 bit로 키 길이가 제한되어 있어서 이를 초과하는 경우엔 에러가 발생하는 것 이다.
이 정책은 <JAVA_HOME>/jre/lib/security/local_policy.jar의 default_local.policy 파일에서 확인할 수 있으며, 정책 내용은 아래와 같다.
// Some countries have import limits on crypto strength. This policy file
// is worldwide importable.
grant {
permission javax.crypto.CryptoPermission "DES", 64;
permission javax.crypto.CryptoPermission "DESede", *;
permission javax.crypto.CryptoPermission "RC2", 128,
"javax.crypto.spec.RC2ParameterSpec", 128;
permission javax.crypto.CryptoPermission "RC4", 128;
permission javax.crypto.CryptoPermission "RC5", 128,
"javax.crypto.spec.RC5ParameterSpec", *, 12, *;
permission javax.crypto.CryptoPermission "RSA", *;
permission javax.crypto.CryptoPermission *, 128;
};
Oracle에서는 128 bit를 초과하는 키를 사용하고자 하는 사용자를 위해 JCE Unlimited Strength 정책 파일을 제공한다.
따라서 사용중인 JAVA 버전에 맞춰 정책 파일을 다운받아 교체 해주면 된다!
- JAVA 7 : https://www.oracle.com/java/technologies/javase-jce7-downloads.html
- JAVA 8 : https://www.oracle.com/kr/java/technologies/javase-jce8-downloads.html
다운받은 local_policy.jar, US_export_policy.jar 파일을 <JAVA_HOME>/jre/lib/security/ 디렉토리로 옮긴다.
기존 정책 파일은 삭제해도 되고, 덮어쓰기해도 된다. 여기까지 하면 JCE로 사용 가능한 모든 암호화의 키 길이 제한이 해제되어 128 bit를 초과하는 대칭키 알고리즘을 사용할 수 있다.
JDK 8u151 이상 버전에서는 아래와 같이 두개의 디렉토리로 나뉘어져 있고, JCE 다운로드 없이 /jre/lib/security/java.security 파일에 crypto.policy=unlimited 옵션 지정 시 바로 사용가능하다.
- <JAVA_HOME>/jre/lib/security/policy/limited
- <JAVA_HOME>/jre/lib/security/policy/unlimited
'개발 > JAVA' 카테고리의 다른 글
[JAVA] 싱글톤 패턴(Singleton Pattern) : 멀티 스레드 환경에서의 문제점 (0) | 2022.02.10 |
---|---|
[JAVA] Priority Queue(우선순위 큐) 우선순위 조건 변경하기 (2) | 2022.02.07 |
[JAVA] class file for javax.interceptor.InterceptorBinding not found (0) | 2022.01.26 |
[JAVA] Optional 개념 및 사용법, 예제 (1) | 2022.01.21 |
[JAVA] Error, Checked Exception, Unchecked Exception 비교 (0) | 2022.01.12 |
댓글