Java.Security.InvalidKeyException: キーのサイズが不正です
-
Java の
java.security.InvalidKeyException: Illegal key size
-
java.security.InvalidKeyException: Illegal key size
の考えられる理由 -
java.security.InvalidKeyException: Illegal key size
を根絶する
このチュートリアルでは、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;
}
}
crypKey
は次のとおりです。
private String crypKey = "qkjll5@2md3gs5Q@FDFqf";
上記の関数は、string
型の引数を受け入れます。 このプログラムを実行すると暗号化されるはずですが、java.security.InvalidKeyException: Illegal key size
エラーが発生します。
それは何を意味し、その理由は何ですか? 次のセクションで見てみましょう。
java.security.InvalidKeyException: Illegal key size
の考えられる理由
このエラーは、当社の Java 仮想マシン (JVM) が、米国の輸出法により制限された暗号化キー サイズのみを許可するポリシーを使用していることを意味します。
ここで重要なのは、なぜこのエラーが発生するのかということです。 以下に 2つの可能性を示します。
- まず、
n ビット
暗号化を必要とするアルゴリズムを使用しています。 超えると、このエラーが発生します。 - 無制限強度管轄ポリシーファイルはまだインストールしていません。
これらのファイルは何ですか? これらのファイルは、Java アプリケーションが 標準アルゴリズム の強力なバージョンを利用できるようにする Java Cryptography Extensions (JCE
) です。
Java ドキュメント によると、Java Development Kit (JDK
) の最新バージョンでは、これらの種類のファイルは必要ありません。 古いバージョンの JDK
を使用する場合にのみ必要です。
次の質問は、どの JDK
バージョンに対してどのファイルをインストールする必要があるかということです。 以下でそれを学びましょう。
Java 9 以降
Java 9 の移行ガイドのセキュリティ更新 に従って、無制限強度の管轄ポリシー ファイルは Java 9 に既に含まれており、デフォルトで使用されます。
JCE
無制限強度管轄ポリシー ファイルを必要とするアプリケーションを古いバージョンの JDK
で実行する場合、それらをダウンロードして Java 9 以降でインストールする必要はありません。 その理由は、それらがすでに含まれており、デフォルトで使用されているためです。
Java 9 での作業中にこのエラーが引き続き発生する場合は、ポリシー構成がより制限的なポリシー (limited
) に変更されています。 ただし、利用できる Java 暗号化ポリシー ファイルは限られているため、これは問題ではありません。
2 番目の理由は、指定された string
型の引数を暗号化する際に間違ったアルゴリズムを使用している可能性があります。 場合によっては、デフォルトで提供されるいずれのポリシー ファイルでも要件が満たされないことがあります。 そのような状況では、ニーズを満たすようにポリシー ファイルをカスタマイズできます。
そのためには、<java-home>/conf/security/java.security
ファイルの crypto.policy
という名前のセキュリティ プロパティを確認するか、 暗号強度構成。
Java 8 以前
-
Java 8 Update 161 以降 - Java 8 u161 の時点で、Java 8 は無制限の強度の管轄ポリシーにデフォルト設定されています。 それでもこのエラーが発生する場合は、構成が
limited
に変更されています。次のセクションでは、
無制限
に変更する手順について説明します。 -
Java 8 Update 151 以降 - Java 8 u151 以降、Java 8 には強度無制限の管轄ポリシーが含まれていますが、デフォルトではアクティブ化されていません。
これを有効にするには、
<java_home>/jre/lib/security
(JDK
の場合) または<java_home>/lib/security
(<java_home>/lib/security
の場合) にあるjava.security
ファイルを編集する必要があります。JRE
)。 次の行のコメントを外す/含める:crypto.policy = unlimited
管理者として実行されているエディターを使用して、このファイルを編集していることを確認してください。 ポリシーは再起動後にのみ有効になるため、Java 仮想マシンを再起動することを忘れないでください。
これは、Tomcat などの実行時間の長いサーバー プロセスに特に必要です。 下位互換性を考慮して、次のセクションの手順に従ってポリシー ファイルをインストールすることもできます。
-
Java 8 Update 151 より前 - Java 8 u144 以前の場合、Oracle の公式 Web サイトで入手できる Java Cryptography Extension (
JCE
) の無制限強度管轄ポリシー ファイルをインストールする必要があります。
以下の手順に従って、これらのファイルをインストールします。
-
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 ポリシー ファイルをダウンロードできます。
-
それらを解凍し、ダウンロードしたファイルに解凍します。 その結果、
jce
という名前のサブディレクトリが作成されます。このディレクトリには、次のファイルが含まれます。
README.txt local_policy.jar US_export_policy.jar
-
無制限強度ポリシー
JAR
ファイルをインストールします。 元の強力
で制限付き
のポリシー バージョンに戻したい場合は、元の Java Cryptography Extension ポリシー ファイル (US_export_policy.jar
およびlocal_policy.jar
) のコピーを作成することを忘れないでください。 -
strong
ポリシー ファイルを、前の手順で抽出した無制限の強度のバージョンに置き換えます。 Java Cryptography Extension 管轄ポリシーJAR
ファイルの標準的な場所は次のとおりです。4.1
<java-home>/lib/security
(Unix オペレーティング システム用)。
4.2<java-home>\lib\security
Windows オペレーティング システム用。
4.3JDK
の場合、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
を取り除く方法は 2つあります。
- Java Cryptography Extension (
JCE
) ポリシー ファイルをインストールすることで解決することもできます (すべての詳細は前のセクションに記載されています)。 - アルゴリズム名も変更できます。
私たちの場合、問題は crypKey
のサイズが 16 文字を超えていることが原因です。 そのため、Cipher
クラスでは、128 ビット
を超える鍵サイズで暗号化することはできません (ここで、128 ビット == 16 バイト == 16 文字
)。
したがって、crypKey
の値は 16 文字
の制限を超えることはできません。
16 文字を超える場合は、JCE
ポリシー ファイルをインストールするか、アルゴリズム名を更新します。 組み込みの鍵サイズ制限を維持したいので、アルゴリズム名を変更します。
そこで、アルゴリズム名を AES
から ARCFOUR
に更新します。 これは、ARCFOUR
アルゴリズムがさまざまな鍵サイズで使用できるためです。