새소식

300x250
2. 웹개발/Error모음

[Java] java.security.InvalidKeyException: Illegal key size or default parameters : Model has no value for key 에러

  • -
728x90

[Java] java.security.InvalidKeyException: Illegal key size or default parameters  : Model has no value for key 에러 해결 방법

 

이 에러는 보통 Java에서 대칭키로 암호화 시도시, 128bit를 초과하는 192 or 256 bit등의 대칭키를 이용하여 암호화를 할 경우 에러가 발생한다.
이와 관련된 내용을 간단히 알아보고 본인 환경에 맞는 해결책을 사용하여 해결 하도록 하자. : )

 

※ 참고
https://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters

 

1. 에러 로그
java.security.InvalidKeyException: Illegal key size or default parameters
	at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1016)
	at javax.crypto.Cipher.implInit(Cipher.java:791)
	at javax.crypto.Cipher.chooseProvider(Cipher.java:854)
	at javax.crypto.Cipher.init(Cipher.java:1233)
	at javax.crypto.Cipher.init(Cipher.java:1173)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.successfulAuthentication(AbstractAuthenticationProcessingFilter.java:332)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:246)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
... 중략

 

2. 원인

▶ Java는 기본적으로 JCE 정책을 제공한다.

 - 이 정책은 미국의 정책에 따라 128 bit로 키 길이가 제한되어 있어서 이를 초과하는 경우엔 에러가 발생할 수 있다.
 - TMI지만 군대에서 이런 암호화, 복호화에 대한 대회도 했었던 기억이 난다.

※참고 https://en.wikipedia.org/wiki/Export_of_cryptography_from_the_United_States

▶ 조금 더 상세한 내용은 %java_home%/jre/lib/security/local_policy.jar의 default_local.policy 파일에서 확인 가능하다.

 - 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;
};

 

3. 해결 방안

▶ Unlimited Strength 정책 적용

 - Oracle에서는 128 bit를 초과하는 키를 사용하고자 하는 사용자를 위해 공식 홈페이지에서 Unlimited Strength 정책 파일을 배포하고 있다.
 - 하기 본인이 사용중인 JAVA 버전에 맞춰 정책 파일을 다운받아 교체 해주면 된다.

3.1 다운로드
1) JAVA 6 : https://www.oracle.com/kr/java/technologies/javase-jce6-downloads.html
2) JAVA 7 : https://www.oracle.com/java/technologies/javase-jce7-downloads.html
3) JAVA 8u151버전 미만 : https://www.oracle.com/kr/java/technologies/javase-jce8-downloads.html 

3.2 적용 방법
 - 다운받은 파일 압축 해제하면 2개의 jar파일(local_policy.jar, US_export_policy.jar)을 볼 수 있는데 
   모두 %java_home%/jre/lib/security/ 디렉토리에 덮어 쓰면 된다.

 - local_policy.jar을 확인 해보면 다음과 같이 바뀌어 있다.

// Manufacturing policy file.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission; 
};

이후 다시 시도해 보면 오류 해소되는 것을 볼 수 있다. :-)

 

 

※ 참고
▶ 변경된 기본 정책
 - 8u161 릴리스 노트. Java 8 Update 151(8u151) 
   즉 JDK 8u151 이상 버전부터는 JCE Default(기본) 정책이 Unlimited이다. 
https://www.java.com/ko/download/help/release_changes.html

 - 반대로 길이를 제한하고 싶다면 java.security 파일에서 crypto.policy를 주석 처리 한다.
 - JDK 8u151 이상 버전에서는 아래와 같이 두개의 디렉토리로 나뉘어져 있다.
   %java_home%/jre/lib/security/policy/limited
   %java_home%/jre/lib/security/policy/unlimited

  
 - %java_home%/jre/lib/security/java.security 파일을 열어 하기 부분을 주석 처리하면 정책 제한을 해제할 수 있다.
crypto.policy=unlimited

 

300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.