programing tip

InvalidKeyException 잘못된 키 크기

itbloger 2020. 12. 15. 08:15
반응형

InvalidKeyException 잘못된 키 크기


내 개발 MacBook Pro에서 훌륭하게 실행되는 테스트가 있지만 지속적 통합 TeamCity 서버에서 실행되지 않습니다.

오류는 다음과 같습니다.

java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)

개발 상자와 TeamCity는 모두 Java 1.6을 사용하며 특수 AES 암호화가 필요한 경우 BouncyCastle 라이브러리를 사용합니다.

코드는 다음과 같습니다.

private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
    Security.addProvider(new BouncyCastleProvider());
    SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
    return cipher.doFinal(info.getBytes("UTF-8"));
}

최신 정보

선택한 답변에 따르면 TeamCity 설치에서 무언가를 수정해야하고 일부 사용자 설치에 영향을 미칠 수 있으므로 제한없이 다른 암호화 라이브러리로 전환해야하는 좋은 선택이 아닙니다. 그래서 아마도 탄력성이 도움이 될 것입니다.

업데이트 2

이 제한을 피하기 위해 실제로 BouncyCastle을 사용하도록 전환했습니다. BC 제공자가 아닌 자체 BC 클래스를 직접 사용하는 경우에만 작동합니다.


이 오류는 Java 가상 머신이 미국 수출 법으로 인해 제한된 암호화 키 크기 만 허용하는 정책을 사용함을 의미합니다.

Java 9 이상

Unlimited Strength Jurisdiction Policy Files는 Java 9에 포함되어 있으며 기본적으로 사용됩니다 ( Java 9 Migration Guide의 보안 업데이트 참조 ).

Java 9에서이 오류가 발생하면 정책 구성이 더 제한적인 정책 ( limited) 으로 변경되었음을 의미 할 수 있습니다 . 마이그레이션 가이드의 지침을 참조하세요.

JCE 관할 정책 파일 기본값은 무제한입니다.

애플리케이션에 이전에 JCE (Java Cryptography Extension) Unlimited Strength Jurisdiction Policy 파일이 필요한 경우 더 이상 다운로드하거나 설치할 필요가 없습니다. JDK에 포함되어 있으며 기본적으로 활성화됩니다.

국가 또는 용도에 더 제한적인 정책이 필요한 경우 제한된 Java 암호화 정책 파일을 계속 사용할 수 있습니다.

기본적으로 제공되는 정책 파일 중 하나에서 충족되지 않는 요구 사항이있는 경우 이러한 정책 파일을 사용자 정의하여 요구 사항을 충족 할 수 있습니다.

파일 crypto.policy보안 속성 <java-home>/conf/security/java.security또는 Java 플랫폼, Standard Edition Security Developer 's Guide의 암호화 강도 구성 을 참조하십시오.

Java 8 이하

Java 8 업데이트 161 이상

Java 8 업데이트 161부터 Java 8은 기본적으로 무제한 강도 관할 정책을 사용합니다. 이 오류가 발생하면 구성이로 변경되었음을 나타낼 수 limited있습니다. 이를 다시으로 변경하려면 Java 8 업데이트 151의 다음 섹션 또는 Java 9의 이전 섹션에있는 지침을 참조하십시오 unlimited.

Java 8 업데이트 151 이상

Java 8 Update 151부터는 Unlimited Strength Jurisdiction Policy가 Java 8에 포함되어 있지만 기본적으로 사용되지는 않습니다. 활성화하려면 (JDK의 경우) 또는 (JRE의 경우) java.security에서 파일 을 편집해야합니다 . 줄 주석 제거 (또는 포함)<java_home>/jre/lib/security<java_home>/lib/security

crypto.policy=unlimited

관리자 권한으로 실행되는 편집기를 사용하여 파일을 편집해야합니다.

정책 변경은 JVM을 다시 시작한 후에 만 ​​적용됩니다 (이는 Tomcat과 같은 장기 실행 서버 프로세스에 특히 중요 함).

이전 버전과의 호환성을 위해 다음 섹션에 설명 된대로 정책 파일을 설치해도 여전히 작동합니다.

Java 8 업데이트 151 이전

Java 8 업데이트 144 및 이전 버전의 경우 JCE (Java Cryptography Extension) Unlimited Strength Jurisdiction Policy Files ( Oracle 에서 사용 가능)를 설치해야합니다 .

이 파일을 설치하려면 ( README.txt다운로드에서) :

  1. 무제한 강도 JCE 정책 파일을 다운로드하십시오.

  2. 다운로드 한 파일의 압축을 풀고 압축을 풉니 다.

    그러면 jce라는 하위 디렉토리가 생성됩니다. 이 디렉토리에는 다음 파일이 포함되어 있습니다.

    README.txt                   This file
    local_policy.jar             Unlimited strength local policy file
    US_export_policy.jar         Unlimited strength US export policy file
    
  3. 무제한 강도 정책 JAR 파일을 설치하십시오.

    In case you later decide to revert to the original "strong" but limited policy versions, first make a copy of the original JCE policy files (US_export_policy.jar and local_policy.jar). Then replace the strong policy files with the unlimited strength versions extracted in the previous step.

    The standard place for JCE jurisdiction policy JAR files is:

    <java-home>/lib/security           [Unix]
    <java-home>\lib\security           [Windows]
    

Note for the JDK it is in jre/lib/security.

The new policy file only takes effect after restarting the JVM (this is especially important for long-running server processes like Tomcat).


I had a similar problem, but in my case, there was a path error.

JAVA_HOME was jdk1.6.0_18, so I put the two jars into jdk1.6.0_18/lib/security, but within jdk1.6.0_18 is the jre directory. Both files should have been put in jdk1.6.0_18/jre/lib/security.


In addition to installing policy files, also make sure that CUSTOMLONGSECRETKEY...getBytes() does indeed produce 32 bytes array. I would use CUSTOMLONGSECRETKEY.getBytes(some encoding) and get first 32 bytes from that. Better yet, use whole secret key to derive keys for AES with the size that you need.


Make sure you know the path to JAVA_HOME that your IDE uses. In order to copy to the correct path.

In my case I use IntelliJ: /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/security

Instead of when i show the $JAVA_HOME in the console. /Users/myuser/.sdkman/candidates/java/current/jre/lib/security


I was facing the same issue for jdk 1.8.0_151-

For this and above version, you do not need to download the jar files related to security.Because, local_policy.jar and US_export_policy.jar is already included in these versions under the path- \jre\lib\security\policy (JAVA_HOME refers to your current java installation folder) The only chng you need to make is in java.security file which is present in /jre/lib/security - uncomment the line - crypto.policy=unlimited

ReferenceURL : https://stackoverflow.com/questions/3862800/invalidkeyexception-illegal-key-size

반응형