Javaセキュリティ:不正なキーサイズまたはデフォルトパラメータ?


409

私は以前これについて質問しましたが、それは正しく答えられず、どこにも導きませんでした。

だから私は問題のいくつかの詳細を明らかにしました、そして私はこれをどのように修正できるか、私が何をすべきかについてあなたの考えを本当に聞きたいです。

私が持っているのJava 1.6.0.12はちょうど完全に私のLinuxサーバと実行以下のコードにインストールされています。

String key = "av45k1pfb024xa3bl359vsb4esortvks74sksr5oy4s5serondry84jsrryuhsr5ys49y5seri5shrdliheuirdygliurguiy5ru";
try {
    Cipher c = Cipher.getInstance("ARCFOUR");

    SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "ARCFOUR");
    c.init(Cipher.DECRYPT_MODE, secretKeySpec);

    return new String(c.doFinal(Hex.decodeHex(data.toCharArray())), "UTF-8");

} catch (InvalidKeyException e) {
    throw new CryptoException(e);
}

今日、サーバーユーザーにJava 1.6.0.26をインストールしました。アプリケーションを実行しようとすると、次の例外が発生します。私の推測では、Javaのインストール構成と関係があるため、最初の構成では機能しますが、後のバージョンでは機能しません。

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at my.package.Something.decode(RC4Decoder.java:25) ~[my.package.jar:na]
    ... 5 common frames omitted

25行目c.init(Cipher.DECRYPT_MODE, secretKeySpec);

注:
*サーバーの1.6.0.12 javaディレクトリのjava.security は、1.6.0.26 java.securityファイルとほぼ完全に一致します。最初のプロバイダーには追加のプロバイダーはありません。
*前の質問はこちらです。



4
これは、エラーとしてスローされる場合もありCaused by: java.security.InvalidKeyException: Illegal key sizeます
。Java8

OpenJDKを使用するだけで動作します。
Rodrigo Asensio 2017年

@RodrigoAsensio:OpenJDKを使用していますが、動作しません。無制限のストレングス管轄ポリシーファイルのjarファイルをインストールする必要があります。そして、それはうまくいきます。
anjanb 2017

5
@AniketThakurの回答を更新します。Java 9およびJava 8u151以降、管轄ポリシーファイルをダウンロードして手動でインストールする必要がなくなりました。無制限の暗号化を有効にするには、新しいcrypto.policy Securityプロパティを使用できます。新しいセキュリティプロパティ(crypto.policy)がjava.securityファイルで設定されているか、JCEフレームワークが初期化される前にSecurity.setProperty()呼び出しを使用して動的に設定されている場合、その設定が優先されます。デフォルトでは、プロパティは未定義です。
MarcinKłopotek2017年

回答:


722

ほとんどの場合、無制限の強度ファイルがインストールされていません。

このファイルをダウンロードする必要があるかもしれません:

Java Cryptography Extension(JCE)無制限強度管轄ポリシーファイル6

Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files 7ダウンロード

Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files 8 Download(Java 8 u162より前のバージョンでのみ必要)

zipからjarファイルを抽出し、それらをに保存します${java.home}/jre/lib/security/


2
@JamesBlack -うん、と作るために必ずすべての塩基が、私はJARの下に置く覆われていたJava/jre/lib/securityJava/jdk/lib/securityJava/jdk/jre/lib/security。「java -version」を実行すると、予期した詳細が返されます。
2012年

5
IBMのSDK(WebSphereなど)の場合、無制限の管轄ポリシーファイルをwww14.software.ibm.com/webapp/iwm/web/preLogin.do?source=jcesdk
quietmint

4
Java 9およびJava 8u151以降、管轄ポリシーファイルをダウンロードして手動でインストールする必要がなくなりました。無制限の暗号化を有効にするには、新しいcrypto.policy Securityプロパティを使用できます。新しいセキュリティプロパティ(crypto.policy)がjava.securityファイルで設定されている場合、またはJCEフレームワークが初期化される前にSecurity.setProperty()呼び出しを使用して動的に設定されている場合、その設定が優先されます。デフォルトでは、プロパティは未定義です。
MarcinKłopotek2017年

4
そのため、この賛成投票の回答は古くなり、非推奨になりました。stackoverflow.com/a/46857694/2808798が「受け入れられた」回答になるように、この回答をどのように賛成または抑制しますか?
ジェシーアデルマン

3
@JesseAdelman-残念ながら、これはほぼ7歳です。誰もがそれを変更する必要があるでしょう。
ジェームズブラック

54

JRE / JDK / Java 8の管轄ファイルは、次の場所にあります。

Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files 8ダウンロード

Jamesが上で言ったように:
にファイルをインストールします${java.home}/jre/lib/security/


2
6と7を使用してみましたが、機能しませんでした。8.をインストールする必要がありました。ありがとうございます。
Jason Kim

9
新しいリリースJDK 8u151には、「暗号化ポリシーを制御する新しいセキュリティプロパティ」があります。今、それは切り替えるプロパティの変更です。一番下の行:「lib \ security \ java.security」の「#crypto.policy = unlimited」の行から「#」を削除して、256ビットキーの使用を有効にします。oracle.com/technetwork/java/javase/8u151-relnotes-3850493.html
hemisphire

1
ありがとう!これはセキュリティプロパティなので、Security.setProperty( "crypto.policy"、 "unlimited")を呼び出すこともできます。出典:@hemisphireのリンク:)
Fluf

42

JAVA 7の場合、ダウンロードリンクはjce-7-downloadです。

ダウンロードした2つのjarをJava \ jdk1.7.0_10 \ jre \ lib \ securityにコピーします
。古いjarのバックアップを取り、安全な側に置きます。

JAVA 8の場合、ダウンロードリンクはjce-8-downloadです
。ダウンロードしたjarをJava \ jdk1.8.0_45 \ jre \ lib \ securityにコピーします
。古いjarのバックアップを取り、安全な側に置きます。


39

Java 9、Java 8u161Java 7u171Java 6u181では、制限がデフォルトで無効になっています。Java Bug Databaseの問題を参照してください。


以降でJavaの8u151あなたは、プログラムの制限を無効にすることができます。

以前のリリースでは、JDKが無制限の暗号化を使用できるようにするには、JCE管轄ファイルを個別にダウンロードしてインストールする必要がありました。ダウンロードとインストールの手順は不要になりました。

代わりに、JCEクラスを最初に使用する前に(つまり、アプリケーションの起動直後に)次の行を呼び出すことができます。

Security.setProperty("crypto.policy", "unlimited");

Androidではどうですか?これらの制限メソッドはどのAPIレベルで解決できますか?
TheRealChx101

31

これはコードのみのソリューションです。ダウンロードしたり、設定ファイルをいじったりする必要はありません。

これは、Java 8テストされた反射ベースのソリューションです。

プログラムの早い段階で、このメソッドを1回呼び出します。

//インポート

import javax.crypto.Cipher;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;

//方法

public static void fixKeyLength() {
    String errorString = "Failed manually overriding key-length permissions.";
    int newMaxKeyLength;
    try {
        if ((newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES")) < 256) {
            Class c = Class.forName("javax.crypto.CryptoAllPermissionCollection");
            Constructor con = c.getDeclaredConstructor();
            con.setAccessible(true);
            Object allPermissionCollection = con.newInstance();
            Field f = c.getDeclaredField("all_allowed");
            f.setAccessible(true);
            f.setBoolean(allPermissionCollection, true);

            c = Class.forName("javax.crypto.CryptoPermissions");
            con = c.getDeclaredConstructor();
            con.setAccessible(true);
            Object allPermissions = con.newInstance();
            f = c.getDeclaredField("perms");
            f.setAccessible(true);
            ((Map) f.get(allPermissions)).put("*", allPermissionCollection);

            c = Class.forName("javax.crypto.JceSecurityManager");
            f = c.getDeclaredField("defaultPolicy");
            f.setAccessible(true);
            Field mf = Field.class.getDeclaredField("modifiers");
            mf.setAccessible(true);
            mf.setInt(f, f.getModifiers() & ~Modifier.FINAL);
            f.set(null, allPermissions);

            newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES");
        }
    } catch (Exception e) {
        throw new RuntimeException(errorString, e);
    }
    if (newMaxKeyLength < 256)
        throw new RuntimeException(errorString); // hack failed
}

クレジット:Delthas


4
これは、Java SEライセンス契約に違反する可能性があることに注意してください:D. JAVA TECHNOLOGY RESTRICTIONS。お客様は、「java」、「javax」、「 javafx "、" sun "、" oracle "、またはOracleによって命名規則の指定で指定された同様の規則。[...] ソース
SimMac

どうもありがとうございました


16

Windows 7 x64、Eclipse、およびJDK 1.6.0_30を使用しているときにも同じエラーが発生しました。JDKインストールフォルダーにはフォルダーがありjreます。前述のjarをJDKのlib / securityフォルダーに追加しようとしていたため、運が悪かったので、最初はこれが気になりませんでした。フルパス:

C:\Program Files\Java\jdk1.6.0_30\jre\lib\security

このアーカイブjceフォルダーに含まれているファイルをダウンロードして、そのフォルダーに抽出します。


16

Javaでは、デフォルトでAESは128ビットのキーをサポートします。192ビットまたは256ビットのキーを使用する場合、JavaコンパイラーはIllegal key size Exceptionをスローし、これを取得します。

解決策は、ビクターとジェームズの提案どおりです。JREのバージョン(java6、java7またはjava8)に応じて、JCE(Java Cryptography Extension)をダウンロードする必要があります。

JCE zipには、次のJARが含まれています。

  1. local_policy.jar
  2. US_export_policy.jar

これらのjarフォームをに置き換える必要があります<JAVA_HOME>/jre/lib/security。UNIXシステムを使用している場合は、おそらく/home/urs/usr/lib/jvm/java-<version>-oracle/

時々、セキュリティフォルダーのlocal_policy.jar、US_export_policy.jarを置き換えるだけではUNIXで機能しないため、最初にセキュリティフォルダーをデスクトップにコピーし、jarの@ Desktop / securityフォルダーを置き換え、/ jre / libからセキュリティフォルダーを削除することをお勧めします/&デスクトップセキュリティフォルダを/ jre / lib /に移動します。

例:: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib


5

この問題の原因については、ここで簡単に説明しますリンク先のページはなくなったようですが、応答の1つが必要なものである可能性があります。

実際、US_export_policy.jarとlocal_policy.jarをcore / lib / jceから$ JAVA_HOME / jre / lib / securityにコピーすると役立ちました。ありがとう。


ありがとう。でも、Javaをインストールした後はUS_export_policy.jarlocal_policy.jarすでにlib / securityフォルダーにありました。そして、Javaのインストールフォルダーで、core / lib / jceを見つけることができませんでした。
Rihards、2011年

5

問題があるコンテンツファイルのdefault_local.policyのlocal_policy.jarフォルダ内のjre \ libに\セキュリティ JREをインストールした場合、:

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

世界中で有効な設定が必要ない場合は、このファイルを編集して内容を次のように変更できます

// Country-specific policy file for countries with no limits on crypto strength.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission;
};

これは、OracleからJCEをダウンロードした場合に得られるものです。


4

私も問題が発生しましたが、既存のものを(JCEから)ダウンロードしたもので置き換えた後、問題が解決しました。新しい暗号ファイルは無制限の強度を提供しました。


2

デフォルトでは、Javaは暗号化用にAES 128ビット(16バイト)の鍵サイズのみをサポートします。サポートされているデフォルト以上のものが必要ない場合は、を使用する前に、キーを適切なサイズにトリミングできますCipher。デフォルトでサポートされているキーについては、javadocを参照してください。

これは、ポリシーファイルを変更せずに任意のJVMバージョンで機能するキーを生成する例です。独自の裁量で使用してください。

AgileBitsブログで、キー128から256のキーサイズが重要かどうかについての良い記事がここにあります

SecretKeySpec getKey() {
    final pass = "47e7717f0f37ee72cb226278279aebef".getBytes("UTF-8");
    final sha = MessageDigest.getInstance("SHA-256");

    def key = sha.digest(pass);
    // use only first 128 bit (16 bytes). By default Java only supports AES 128 bit key sizes for encryption.
    // Updated jvm policies are required for 256 bit.
    key = Arrays.copyOf(key, 16);
    return new SecretKeySpec(key, AES);
}

暗号各暗号タイプに対して有効なキーサイズにクラスのドキュメントを指します。
keaplogik

Oracleのドキュメント「Cipher(Encryption)Algorithms AES:Advanced Encryption Standard as specified by FIPS 197 」を参照してください。JoanDaemenおよびVincent RijmenによるRijndaelアルゴリズムとも呼ばれるAESは、128、192のキーをサポートする1​​28ビットのブロック暗号です。および256ビット。
zaph 2016年

それは本当かもしれませんが、クラスのドキュメントで指定されているように、128ビットをサポートするために各Javaバージョンでのみ必要です。自分でテストすると、他のキーサイズを実行するにはJames Blackの回答からポリシーjarが必要になることがわかります
keaplogik

256ビットのキーを使用しないAES実装は、256ビットのキーを使用して大量のAES暗号化を復号化できないため、本質的に役に立たないでしょう。
zaph 2016年

1
256ビットの鍵が必要な場合、おそらく唯一の解決策は、必要に応じてポリシーファイルをインストールすることです。鍵を切り捨てないで、セキュリティを弱める可能性があり、相互運用性の場合には不可能かもしれません。
zaph 2016年

2

Java 9または8u151以降、ファイル内の行にコメントを使用できます。

<JAVA_HOME>/jre/lib/security/java.security

そして変更:

#crypto.policy=unlimited

crypto.policy=unlimited

2

Linuxディストリビューションでaptを使用していて、webupd8 PPAを追加している場合は、次のコマンドを実行するだけです。

apt-get install oracle-java8-unlimited-jce-policy

その他の更新:

  1. 無制限強度管轄ポリシーファイルはJava 9に含まれており、デフォルトで使用されます
  2. 以降でのJava 8のアップデート161無制限強度の管轄ポリシーに、Javaの8デフォルト。
  3. 以降でのJava 8のアップデート151、無制限強度の管轄ポリシーは、Java 8に含まれていますが、デフォルトでは使用されません。これを有効にするには、<java_home>/jre/lib/security(JDKの場合)でjava.securityファイルを編集するか、<java_home>/lib/security(JREの。行のコメントを外す(または含める)

    crypto.policy=unlimited

    管理者として実行されているエディターを使用してファイルを編集してください。ポリシーの変更は、JVMを再起動した後にのみ有効になります

Java 8 Update 151は、残りの回答が有効です。JCE無制限強度管轄ポリシーファイルをダウンロードして置き換えます。

詳細については、以下の私の個人的なブログ投稿を参照してください -Java Cryptography Extension(JCE)無制限強度管轄ポリシーファイルをインストールする方法


1

この問題を解決するには2つのオプションがあります

オプション番号1:短いRSA 2048の証明書を使用する

オプション番号2:jre\lib\security java http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.htmlを使用して、2つのjarを更新します。

または、IBM websphereまたはそのjavaを使用するアプリケーションサーバーを使用します。私が直面した主な問題は、最大長の証明書を使用したことです。websphereに耳をデプロイすると、同じ例外がスローされます

Java Security: Illegal key size or default parameters?

2つのjarを使用してwebsphereのjavaインストールフォルダーを更新しました https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US

リンクhttps://www-01.ibm.com/support/docview.wss?uid=swg21663373で参照を確認できます


1

JDK / JREの最新バージョンを使用しいることを確認してください。

私の場合、JCEをJREフォルダーに入れましたが、役に立ちませんでした。IDEから直接(JDKを使用して)プロジェクトを実行していたために発生しました。

次に、JDKとJREを最新バージョン(1.8.0_211)に更新したところ、問題は解決しました。

詳細:https : //bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8170157


1

デフォルトのJDKは、アメリカの制限により、128ビットキーのみによる暗号化をサポートしています。したがって、256ビット長の鍵からの暗号化をサポートするには、フォルダ内で置き換える必要がlocal_policy.jarあります。そうでない場合は、次のようになります。US_export_policy.jars$JAVA_HOME/java-8-oracle/jre/lib/security

java.security.InvalidKeyException:不正なキーサイズまたはデフォルト


0

あなたはそこに行く必要があります

/jdk1.8.0_152 | / jre | / lib | /セキュリティ| java.securityとコメント解除

#crypto.policy=unlimited

crypto.policy=unlimited
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.