6

Java アプリケーションで FIPS 180-3 を有効にしようとしています。FIPS 180-3 では、5 つの安全な [ハッシュ] (http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf) の使用のみが許可されていますが、MD5 はその 1 つではありません。したがって、Sun プロバイダーから MD5 アルゴリズムをプログラムで削除しようとしています。これがサンプルコードです。


public static void main(String[] args) throws Exception {
    Security.removeProvider("SUN");
    Sun sun = new Sun();
    sun.remove("MessageDigest.MD5"); //Comment and it will work !!!
    Security.addProvider(sun);
    Cipher ciph = Cipher.getInstance("AES");                
}   

しかし、これは次の例外をスローしています。「sun.remove(..」とコメントすると、プログラムは正常に動作します。MD5 の代わりに MD2 を削除すると、正常に動作します。

私には、jre ライブラリが署名に MD5 を使用しているように見えますが、jre/lib/ext/sunjce_provider.jar 署名者とその使用 sha1 を確認しました。

私のコードがこのエラーで失敗する理由は何ですか?

TestRemoveMD5.main(TestRemoveMD5.java:20) での javax.crypto.Cipher.getInstance(DashoA13*..) でのスレッド「メイン」java.lang.ExceptionInInitializerError での例外

原因: java.lang.SecurityException: Cannot set up certs for trusted CAs at javax.crypto.SunJCE_b.(DashoA13*..) ... 3 詳細

原因: java.lang.SecurityException: javax.crypto.SunJCE_b.d(DashoA13*..) で javax.crypto.SunJCE_b.c(DashoA13*..) で javax.crypto.SunJCE_b$1 で署名クラスが改ざんされました.run(DashoA13*..) at java.security.AccessController.doPrivileged(Native Method) ... 4 詳細

4

3 に答える 3

1

これは、信頼されていないコードが Sun プロバイダを削除するのを防ぐセキュリティ機能です。そうするための適切な権限を持つことを含む、それを行う方法があります。このリンクhttp://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.htmlにアクセスして、タイトルの見出しであるThe Security Classまでスクロールすると、その方法を読むことができます。プロバイダーを削除するとどうなりますか。

編集

拡張機能ではないインストール済みプロバイダーに関するドキュメントからの抜粋では、プロバイダーの追加や削除などの特定のアクションを実行するためにポリシー ファイルが必要になる場合があります。試すだけの価値があります。

使用する各プロバイダーのベンダーからのドキュメントには、必要なアクセス許可と、そのようなアクセス許可を付与する方法に関する情報が含まれている必要があります。たとえば、拡張機能がインストールされておらず、セキュリティ マネージャーがインストールされている場合、プロバイダーには次のアクセス許可が必要になる場合があります。

-

Security クラスは、インストールされたプロバイダーとセキュリティ全体のプロパティを管理します。静的メソッドのみが含まれ、インスタンス化されることはありません。プロバイダーを追加または削除するメソッド、およびセキュリティ プロパティを設定するメソッドは、信頼できるプログラムによってのみ実行できます。現在、「信頼できるプログラム」は次のいずれかです。

  • セキュリティ マネージャの下で実行されていないローカル アプリケーション、または
  • 指定されたメソッドを実行する権限を持つアプレットまたはアプリケーション (以下を参照)。

コードが試行されたアクション (プロバイダーの追加など) を実行するために信頼されていると見なされると判断するには、その特定のアクションに対する適切なアクセス許可がアプレットに付与されている必要があります。

-

このようなファイル内の各 "grant" ステートメントは、指定されたコード ソースに一連のアクセス許可を付与し、許可されるアクションを指定します。

サンプルのポリシー構成ファイルは次のとおりです。

grant codeBase "file:/home/sysadmin/", signedBy "sysadmin" {
    permission java.security.SecurityPermission "insertProvider.*";
    permission java.security.SecurityPermission "removeProvider.*";
    permission java.security.SecurityPermission "putProviderProperty.*";
};
于 2012-06-26T14:47:07.863 に答える
0

私は根本的な原因を理解したかもしれないと思いますが、それでもそれがどこから来ているのか理解できません。X509CertImplをデバッグしようとしましたが、MD5を使用している「JCEDevelopment」によって署名された証明書を1つ取得しました。ただし、ロードされた他のすべての証明書は、SHA1withDSAを使用して正しく署名されています。これがjreのバグであるかどうかはわかりません。

[[バージョン:V1件名:CN = JCE開発、OU = Javaソフトウェア、O = Sun Microsystems、L =クパチーノ、ST = CA、C = US署名アルゴリズム:MD5withRSA、OID = 1.2.840.113549.1.1.4

キー:Sun RSA公開鍵、512ビットモジュラス:9182591386680323574119504178341234548416270629561070323164514737894957593991212767744352158438329809500219147803751143974067780130174290713135793698837217公開指数:65537有効性:[From:Thu Oct 31 20:57:44 IST 2002、To:W開発、OU = Javaソフトウェア、O = Sun Microsystems、L = Cupertino、ST = CA、C = USシリアル番号:[02]

]アルゴリズム:[MD5withRSA]署名:0000:2F E5 9C 54 5C A3 FA 25 E5 11 53 55 41 B3 4E 39 /..T ..%.. SUA.N9 0010:49 56 9A 59 97 1A 23 4A 29 79 C8 74 D7 1C D5 95 IV.Y ..#J)yt ... 0020:32 8B E2 56 D3 39 A5 7D 9E E2 53 F7 91 62 11 04 2..V.9 .... S..b .. 0030:24 1C 1D AD 4A 32 88 63 86 2E 8E E9 8B A2 73 00 $ ... J2.c......s。

]

于 2012-06-27T06:28:05.903 に答える
0

したがって、この演習からの私の推論は、jce自体が署名目的でクラスを検証するためにMD5を必要とするため、jreからMD5アルゴリズムを削除できず、したがってjre1.6自体をFIPS180-3に準拠させることができないということです。

FIPSのc#はMD5をロードできません。FIPS対応システム用のMD5に代わるハッシュアルゴリズムはありますか?を参照してください。。上記のテストでは、Javaはその動作を実行できないと思います。

誰かが観察や私が見落としているかもしれない明らかな間違いによって反対するかどうか私に知らせてください。

于 2012-06-27T06:36:43.187 に答える