Java.Security.InvalidKeyException: 잘못된 키 크기

Mehvish Ashiq 2023년10월12일
  1. Java의 java.security.InvalidKeyException: Illegal key size
  2. java.security.InvalidKeyException: Illegal key size의 가능한 이유
  3. java.security.InvalidKeyException: Illegal key size 근절
Java.Security.InvalidKeyException: 잘못된 키 크기

이 튜토리얼은 java.security.InvalidKeyException: Illegal key size를 포함하는 Java 코드를 제공합니다. 그런 다음 가능한 이유를 알아보겠습니다.

마지막으로 지정된 오류를 제거하여 솔루션으로 이동합니다.

Java의 java.security.InvalidKeyException: Illegal key size

예제 코드(App1.java 클래스):

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class App1 {
  private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

  public String cryptAString(String str) {
    String ret = "";
    try {
      byte[] crypKeyData = this.crypKey.getBytes();
      SecretKeySpec secretKeySpec = new SecretKeySpec(crypKeyData, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
      ret = new String(cipher.doFinal(str.getBytes("UTF-8")));

    } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException
        | UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException ex) {
      ex.printStackTrace();
    }
    return ret;
  }
}

cryptKey는 다음과 같습니다.

private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

위에 주어진 함수는 문자열 유형 인수를 허용합니다. 이 프로그램을 실행할 때 암호화해야 하지만 java.security.InvalidKeyException: Illegal key size 오류가 발생합니다.

그것은 무엇을 의미하며 그 이유는 무엇입니까? 다음 섹션에서 살펴보겠습니다.

java.security.InvalidKeyException: Illegal key size의 가능한 이유

이 오류는 JVM(Java Virtual Machine)이 미국 수출법으로 인해 제한된 암호화 키 크기만 허용하는 정책을 사용하고 있음을 의미합니다.

이제 요점은 이 오류가 발생하는 이유입니다. 아래에 두 가지 가능성이 주어집니다.

  1. 첫째, n-bits 암호화가 필요한 알고리즘을 사용하고 있습니다. 초과하면 이 오류가 발생합니다.
  2. 우리는 아직 무제한 강도 관할 정책 파일을 설치하지 않았습니다.

이 파일들은 무엇입니까? 이러한 파일은 Java 응용 프로그램이 표준 알고리즘의 강력한 버전을 활용할 수 있도록 하는 Java Cryptography Extensions(JCE)입니다.

Java 문서에 따르면 최신 버전의 Java Development Kit(JDK)에는 이러한 종류의 파일이 필요하지 않습니다. 이전 버전의 JDK만 사용하면 됩니다.

다음 질문은 어떤 JDK 버전에 대해 어떤 파일을 설치해야 하느냐입니다. 아래에서 알아보도록 하겠습니다.

자바 9 이상

Java 9 마이그레이션 가이드의 보안 업데이트에 따라 무제한 강도 관할 정책 파일은 이미 Java 9에 포함되어 있으며 기본적으로 사용됩니다.

이전 버전의 JDK와 함께 JCE 무제한 권한 관할 정책 파일이 필요한 애플리케이션을 실행하려는 경우 Java 9 이상에서 다운로드하여 설치할 필요가 없습니다. 그 이유는 기본적으로 이미 포함되어 사용되기 때문입니다.

Java 9로 작업하는 동안 이 오류가 계속 발생하면 정책 구성이 더 제한적인 정책(limited)으로 변경됩니다. 그러나 제한된 Java 암호화 정책 파일을 사용할 수 있으므로 문제가 되지 않습니다.

두 번째 이유는 제공된 문자열 유형 인수를 암호화하는 동안 잘못된 알고리즘을 사용할 수 있습니다. 경우에 따라 기본적으로 제공되는 정책 파일이 요구 사항을 충족하지 못하는 경우가 있습니다. 이러한 상황에서 정책 파일을 사용자 지정하여 요구 사항을 충족할 수 있습니다.

이를 위해 <java-home>/conf/security/java.security 파일에서 crypto.policy라는 보안 속성을 확인하거나 Java Platform, Standard Edition Security Developer’s Guide( 암호화 강도 구성.

자바 8 이하

  1. Java 8 업데이트 161 이상 - Java 8 u161부터 Java 8은 기본적으로 무제한 강도 관할 정책을 사용합니다. 여전히 이 오류가 발생하면 구성이 limited로 변경된 것입니다.

    다음 섹션에서는 무제한으로 변경하는 지침을 볼 것입니다.

  2. Java 8 업데이트 151 이상 - Java 8 u151부터 무제한 강도 관할 정책이 Java 8에 포함되지만 기본적으로 활성화되지는 않습니다.

    이를 활성화하려면 <java_home>/jre/lib/security(JDK의 경우) 또는 <java_home>/lib/security(의 경우)에서 찾을 수 있는 java.security 파일을 편집해야 합니다. JRE). 다음 행을 주석 해제/포함합니다.

    crypto.policy = unlimited
    

    관리자 권한으로 실행되는 편집기를 사용하여 이 파일을 편집해야 합니다. 정책은 다시 시작한 후에만 적용되므로 JVM(Java Virtual Machine)을 다시 시작하는 것을 잊지 마십시오.

    예를 들어 Tomcat과 같이 장기 실행 서버 프로세스에 특히 필요합니다. 이전 버전과의 호환성을 고려하여 다음 섹션의 지침에 따라 정책 파일을 설치해도 됩니다.

  3. Java 8 업데이트 151 이전 - Java 8 u144 및 이전 버전의 경우 Oracle 공식 웹 사이트에서 제공되는 JCE(Java Cryptography Extension) 무제한 권한 관할 정책 파일을 설치해야 합니다.

다음 단계에 따라 이러한 파일을 설치하십시오.

  1. Java Cryptography Extension 무제한 강도 관할 정책 파일을 다운로드합니다.

    여기(https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html) 및 여기(https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html)로 이동하여 각각 Java 6 및 7용 Java Cryptography Extension Unlimited Strength Jurisdiction Policy Files를 다운로드할 수 있습니다.

  2. 압축을 풀고 다운로드한 파일에 압축을 풉니다. 결과적으로 jce라는 하위 디렉토리가 생성됩니다.

    이 디렉토리에는 다음 파일이 있습니다.

    README.txt
    local_policy.jar
    US_export_policy.jar
    
  3. 무제한 강도 정책 JAR 파일을 설치합니다. 원래 “강력"하지만 “제한된” 정책 버전으로 되돌리려면 원래 Java Cryptography Extension 정책 파일(US_export_policy.jarlocal_policy.jar)의 복사본을 만드십시오.

  4. strong 정책 파일을 이전 단계에서 추출한 무제한 강도 버전으로 바꿉니다. Java Cryptography Extension 관할 정책 JAR 파일의 표준 위치는 다음과 같습니다.

    4.1 Unix 운영 체제용 <java-home>/lib/security.
    4.2 Windows 운영 체제용 <java-home>\lib\security.
    4.3 JDK의 경우 jre/lib/security에 있습니다.

java.security.InvalidKeyException: Illegal key size 근절

예제 코드(App1.java 클래스):

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class App1 {
  private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

  public String cryptAString(String str) {
    String ret = "";
    try {
      byte[] crypKeyData = this.crypKey.getBytes();
      SecretKeySpec secretKeySpec = new SecretKeySpec(crypKeyData, "ARCFOUR");
      Cipher cipher = Cipher.getInstance("ARCFOUR");
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
      ret = new String(cipher.doFinal(str.getBytes("UTF-8")));

    } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException
        | UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException ex) {
      ex.printStackTrace();
    }
    return ret;
  }
}

예제 코드(Test.java 클래스):

public class Test {
  public static void main(String[] args) {
    App1 app = new App1();
    String str = "ThisIsFoundation";
    String cryptedStr = app.cryptAString(str);
    System.out.println(cryptedStr);
    System.out.println(cryptedStr.chars().count());
  }
}

암호화된 문자열은 ??c[D]???J??n?로 출력되며, 그 길이는 15 글자입니다. 이 문제를 어떻게 해결했는지 알려주실 수 있나요?

두 가지 방법으로 InvalidKeyException을 제거할 수 있습니다.

  1. JCE(Java Cryptography Extension) 정책 파일을 설치하여 해결할 수도 있습니다(모든 세부 정보는 이전 섹션에서 제공됨).
  2. 알고리즘 이름도 변경할 수 있습니다.

우리의 경우 문제는 16자를 초과하는 cryptKey의 크기 때문입니다. 따라서 Cipher 클래스는 128비트(여기서 128비트 == 16바이트 == 16자)보다 큰 키 크기로 암호화할 수 없습니다.

따라서 cryptKey 값은 16자 제한을 초과할 수 없습니다.

16자를 초과하려면 JCE 정책 파일을 설치하거나 알고리즘 이름을 업데이트합니다. 기본 제공 키 크기 제한을 유지하기 위해 알고리즘 이름을 변경합니다.

따라서 알고리즘 이름을 AES에서 ARCFOUR로 업데이트합니다. ARCFOUR 알고리즘을 다양한 키 크기로 사용할 수 있기 때문입니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

관련 문장 - Java Exception