web-dev-qa-db-ja.com

無制限の暗号化が利用可能かどうかを確認する

現在のJVMに無制限の強度の暗号化が利用できる場合、Javaコードで、どのように確認できますか?

44
Chi-Lan

おそらく Cipher.getMaxAllowedKeyLength() を使用できると思います。また、使用している暗号をAESなどの「良好な」安全な暗号の既知のリストと比較します。

参照記事はこちら Java 1.4(これらも法律が変更されない限り、おそらく変更されていない-参照未満)。

暗号化された輸出入の制限がある国で活動している場合は、あなたの国の法律に相談する必要がありますが、これらの状況では、しないと仮定するのがおそらく安全ですJVMで無制限の強度の暗号化を使用できます(デフォルト)。別の言い方をすれば、 オラクルの公式JVM を使用し、米国が暗号化の輸出制限を平準化した国に住んでいると仮定します(そしてオラクルは米国企業であるため) 、これらの制限の対象になります)、この場合、無制限の強さを利用できないと仮定することもできます。

もちろん、 それはあなた自身の構築を妨げるものではありません であり、それにより無制限の強さを自分自身に付与しますが、あなたの地域の法律によっては違法かもしれません。

この記事 米国から他の国への輸出制限の概要を説明しています。

25
jefflunt

Dan Cruzの答えと同じ精神で、ただし1行のコードで、例外を回避することはありません。

boolean limit = Cipher.getMaxAllowedKeyLength("RC5")<256;

したがって、完全なプログラムは次のようになります。

import javax.crypto.Cipher;

public class TestUCE {
  public static void main(String args[]) throws Exception {
    boolean unlimited =
      Cipher.getMaxAllowedKeyLength("RC5") >= 256;
    System.out.println("Unlimited cryptography enabled: " + unlimited);
  }
}
43

Linuxを使用していて、JDKをインストールしている場合(ただし、Beanshellは使用できません)、JDKに付属のrunscriptコマンドで確認できます。

jrunscript -e 'exit (javax.crypto.Cipher.getMaxAllowedKeyLength("RC5") >= 256 ? 0 : 1);'; echo $?

これは、無制限の暗号化が利用可能な場合は0ステータスコードを返し、利用できない場合は1を返します。ゼロはシェル関数の正しい「成功」戻り値であり、ゼロ以外は失敗を示します。

34
Igor Metz

制限が適用されるかどうかを確認する方法は、メソッド Cipher.getMaxAllowedKeyLength

JCE無制限強度の管轄ポリシーファイルがインストールされている場合、Integer.MAX_VALUEが返されます。

これは、Integer.MAX_VALUEが返され、制限が適用されます。

さらに詳しい情報は、以下のメソッドのJavaDocにあります。

/**
 * Determines if cryptography restrictions apply.
 * Restrictions apply if the value of {@link Cipher#getMaxAllowedKeyLength(String)} returns a value smaller than {@link Integer#MAX_VALUE} if there are any restrictions according to the JavaDoc of the method.
 * This method is used with the transform <code>"AES/CBC/PKCS5Padding"</code> as this is an often used algorithm that is <a href="https://docs.Oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#impl">an implementation requirement for Java SE</a>.
 * 
 * @return <code>true</code> if restrictions apply, <code>false</code> otherwise
 */
public static boolean restrictedCryptography() {
    try {
        return Cipher.getMaxAllowedKeyLength("AES/CBC/PKCS5Padding") < Integer.MAX_VALUE;
    } catch (final NoSuchAlgorithmException e) {
        throw new IllegalStateException("The transform \"AES/CBC/PKCS5Padding\" is not available (the availability of this algorithm is mandatory for Java SE implementations)", e);
    }
}

Java 9以降、デフォルトで無制限の暗号化ポリシーがインストールされます(インポート/エクスポート規制の影響を受けるポリシーでは、limited代わりに暗号化ポリシー)。したがって、このコードは主に下位互換性や他のランタイムに必要です。

16
Maarten Bodewes

これは、テストを可能にする完全なコピーペーストバージョンです。

import javax.crypto.Cipher;
import Java.security.NoSuchAlgorithmException;

class Test {
    public static void main(String[] args) {
        int allowedKeyLength = 0;

        try {
            allowedKeyLength = Cipher.getMaxAllowedKeyLength("AES");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        System.out.println("The allowed key length for AES is: " + allowedKeyLength);
    }
}

走る

javac Test.Java

Java Test

JCEが出力を機能していない場合:128 JCEは次のように機能しています:2147483647

5
code

Linuxを使用している場合は、このコマンドで簡単に確認できます

Java -version ; \
echo 'System.err.println(javax.crypto.Cipher.getInstance("AES/CBC/PKCS5Padding").getMaxAllowedKeyLength("AES"));'  \
| Java -cp /usr/share/Java/bsh-*.jar bsh.Interpreter >/dev/null

出力がそのようなものである場合、無制限の強度の暗号化は利用できません

Java version "1.7.0_76"
Java(TM) SE Runtime Environment (build 1.7.0_76-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode)
128
3
cklar

[〜#〜] note [〜#〜]jefflunt's answer または KonstantinSpirov's answer を使用してください=。この回答は、常にtrueを返すため、有効な回答ではありません。この回答は、回答とコメントの他の場所で参照されており、参照としてのみ有用であるため、ここに残しています。


以下を使用してstatic final booleanを初期化して、無制限の暗号サポートのテストに使用できます(AES 256ビットは無制限ポリシーがインストールされている場合のみサポートされるため)。

boolean isUnlimitedSupported = false;
try {
    KeyGenerator kgen = KeyGenerator.getInstance("AES", "SunJCE");
    kgen.init(256);
    isUnlimitedSupported = true;
} catch (NoSuchAlgorithmException e) {
    isUnlimitedSupported = false;
} catch (NoSuchProviderException e) {
    isUnlimitedSupported = false;
}
System.out.println("isUnlimitedSupported=" + isUnlimitedSupported);
// set static final variable = isUnlimitedSupported;
0
Dan Cruz