172

そのままでは Java でサポートされていない 256 ビット AES 暗号化を使用するアプリがあります。これを正しく機能させるには、セキュリティ フォルダに JCE の無制限の強度の jar ファイルをインストールします。これは、開発者である私にとっては問題ありません。インストールできます。

私の質問は、このアプリが配布されるため、エンド ユーザーはこれらのポリシー ファイルをインストールしていない可能性が高いということです。アプリを機能させるためだけにエンド ユーザーにこれらをダウンロードさせることは、魅力的なソリューションではありません。

エンド ユーザー マシン上のファイルを上書きせずにアプリを実行する方法はありますか? ポリシー ファイルをインストールせずに処理できるサード パーティ ソフトウェアはありますか? または、JAR 内からこれらのポリシー ファイルを参照する方法はありますか?

4

11 に答える 11

22

これが解決策です:http://middlesphere-1.blogspot.ru/2014/06/this-code-allows-to-break-limit-if.html

//this code allows to break limit if client jdk/jre has no unlimited policy files for JCE.
//it should be run once. So this static section is always execute during the class loading process.
//this code is useful when working with Bouncycastle library.
static {
    try {
        Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
        field.setAccessible(true);
        field.set(null, java.lang.Boolean.FALSE);
    } catch (Exception ex) {
    }
}
于 2015-01-25T11:57:41.233 に答える
14

JDK 8u102 の時点で、リフレクションに依存する投稿されたソリューションは機能しなくなります。これらのソリューションが設定するフィールドは現在final( https://bugs.openjdk.java.net/browse/JDK-8149417 ) です。

(a) Bouncy Castle の使用、または (b) JCE ポリシー ファイルのインストールのいずれかに戻ったようです。

于 2016-07-28T01:41:33.023 に答える
13

弾力がある城は私が知る限りまだインストールされた瓶を必要とします。

私は少しテストをしました、そしてそれはこれを確認するようでした:

http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions

于 2011-05-08T17:56:28.477 に答える
10

別の暗号化ライブラリについては、Bouncy Castleをご覧ください。AES と多くの追加機能があります。リベラルなオープン ソース ライブラリです。ただし、これを機能させるには、軽量で独自の Bouncy Castle API を使用する必要があります。

于 2009-08-05T12:42:20.667 に答える
5

メソッドを使用できます

javax.crypto.Cipher.getMaxAllowedKeyLength(String transformation)

利用可能なキーの長さをテストするには、それを使用して、何が起こっているかをユーザーに通知します。たとえば、ポリシー ファイルがインストールされていないために、アプリケーションが 128 ビット キーにフォールバックしていることを示すもの。セキュリティ意識の高いユーザーはポリシー ファイルをインストールしますが、他のユーザーはより弱いキーを使用し続けます。

于 2015-07-26T10:11:04.823 に答える
3

私たちのアプリケーションには、クライアント サーバー アーキテクチャがあり、サーバー レベルでのデータの復号化/暗号化のみを許可しました。したがって、JCE ファイルはそこでのみ必要です。

クライアント マシンでセキュリティ jar を更新する必要があるという別の問題がありました。JNLP を使用する${java.home}/lib/security/と、最初の実行時にライブラリと JVM が上書きされます。

それはそれを機能させました。

于 2009-07-24T22:29:13.707 に答える
2

ntoskrnlの回答の更新版を次に示します。さらに、コメントで言及されているArjanのような最終修飾子を削除する関数が含まれています。

このバージョンは、JRE 8u111 以降で動作します。

private static void removeCryptographyRestrictions() {
    if (!isRestrictedCryptography()) {
        return;
    }
    try {
        /*
         * Do the following, but with reflection to bypass access checks:
         * 
         * JceSecurity.isRestricted = false; JceSecurity.defaultPolicy.perms.clear();
         * JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE);
         */
        final Class<?> jceSecurity = Class.forName("javax.crypto.JceSecurity");
        final Class<?> cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions");
        final Class<?> cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission");

        Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");
        isRestrictedField.setAccessible(true);
        setFinalStatic(isRestrictedField, true);
        isRestrictedField.set(null, false);

        final Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy");
        defaultPolicyField.setAccessible(true);
        final PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null);

        final Field perms = cryptoPermissions.getDeclaredField("perms");
        perms.setAccessible(true);
        ((Map<?, ?>) perms.get(defaultPolicy)).clear();

        final Field instance = cryptoAllPermission.getDeclaredField("INSTANCE");
        instance.setAccessible(true);
        defaultPolicy.add((Permission) instance.get(null));
    }
    catch (final Exception e) {
        e.printStackTrace();
    }
}

static void setFinalStatic(Field field, Object newValue) throws Exception {
      field.setAccessible(true);

      Field modifiersField = Field.class.getDeclaredField("modifiers");
      modifiersField.setAccessible(true);
      modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

      field.set(null, newValue);
   }

private static boolean isRestrictedCryptography() {
    // This simply matches the Oracle JRE, but not OpenJDK.
    return "Java(TM) SE Runtime Environment".equals(System.getProperty("java.runtime.name"));
}
于 2017-05-18T19:18:12.947 に答える
-1

プログラムのインストール中に、ユーザーにプロンプ​​トを表示し、DOS バッチ スクリプトまたは Bash シェル スクリプトをダウンロードして、JCE を適切なシステムの場所にコピーします。

以前はサーバー Web サービスに対してこれを行う必要があり、正式なインストーラーの代わりに、ユーザーがアプリを実行する前にアプリをセットアップするためのスクリプトを提供するだけでした。セットアップ スクリプトが実行されるまで、アプリを実行不可にすることができます。また、JCE が見つからないことをアプリに訴えさせ、アプリのダウンロードと再起動を求めることもできますか?

于 2009-07-24T20:09:03.617 に答える