簡體   English   中英

為什么JCE初始化需要MD5

[英]Why MD5 is required for JCE initialization

我正在嘗試在我的java應用程序上啟用FIPS 180-3。 FIPS 180-3只允許使用5個安全[哈希](http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf),MD5不是其中之一。 因此,我試圖以編程方式從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(..”該程序工作正常。如果我刪除MD2,而不是MD5,那么它也可以正常工作。

對我來說,看起來jre libs正在使用MD5進行簽名,但我檢查了jre / lib / ext / sunjce_provider.jar簽名者及其使用sha1。

知道為什么我的代碼失敗了這個錯誤?

TestRemoveMD5.main中的javax.crypto.Cipher.getInstance(DashoA13 * ..)中的線程“main”java.lang.ExceptionInInitializerError中的異常(TestRemoveMD5.java:20)

引起:java.lang.SecurityException:無法在javax.crypto.SunJCE_b上為受信任的CA設置證書。(DashoA13 * ..)... 3更多

引起:java.lang.SecurityException:簽名類已經被javax.crypto.SunJCE_b中的javax.crypto.SunJCE_b.d(DashoA13 * ..)篡改了javax.crypto.SunJCE_b $ 1 .run(DashoA13 * ..)at java.security.AccessController.doPrivileged(Native Method)... 4更多

這是一項安全功能,可防止不受信任的代碼刪除Sun提供程序。 有一種方法可以做到這一點,涉及具有適當的權限。 如果你轉到這個鏈接http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html並向下滾動到標題標題安全類,你可以閱讀如何刪除提供商以及將會發生什么。

編輯

來自已安裝的非擴展提供程序的文檔的摘錄可能需要重新引用策略文件來執行某些操作,例如添加和刪除提供程序。 值得一試。

您將使用的每個提供商的供應商提供的文檔應包括有關所需權限以及如何授予此類權限的信息。 例如, 如果提供程序不是已安裝的擴展並且安裝了安全管理器,則可能需要以下權限

-

Security類管理已安裝的提供程序和安全范圍的屬性。 它只包含靜態方法,並且從不實例化。 添加或刪除提供程序以及設置安全屬性的方法只能由受信任的程序執行。 目前,“可信程序”也是

  • 本地應用程序未在安全管理器下運行,或
  • 具有執行指定方法權限的applet或應用程序(見下文)。

確定代碼被視為可信任以執行嘗試的操作(例如添加提供程序)需要為該特定操作授予applet適當的權限。

-

此類文件中的每個“grant”語句都為指定的代碼源授予一組權限,指定允許哪些操作。

這是一個示例策略配置文件:

 grant codeBase "file:/home/sysadmin/", signedBy "sysadmin" { permission java.security.SecurityPermission "insertProvider.*"; permission java.security.SecurityPermission "removeProvider.*"; permission java.security.SecurityPermission "putProviderProperty.*"; }; 

我想我可能已經找到了根本原因,但仍然沒有弄清楚它的到來。 我試圖調試X509CertImpl,我得到了一個使用MD5的“JCE Development”簽名的證書。 但是所有其他加載的證書都使用SHA1withDSA正確簽名。 我不確定這是否應該是jre的錯誤。

[[版本:V1主題:CN = JCE開發,OU = Java軟件,O = Sun Microsystems,L = Cupertino,ST = CA,C = US簽名算法:MD5withRSA,OID = 1.2.840.113549.1.1.4

重點:孫RSA公共密鑰,512位模數:9182591386680323574119504178341234548416270629561070323164514737894957593991212767744352158438329809500219147803751143974067780130174290713135793698837217公用指數:65537有效期:[來源:周四10月31日20時57分44秒IST 2002年,為:星期三10月31日20時57分44秒IST 2007]發行人:CN = JCE開發,OU = Java軟件,O = Sun Microsystems,L = Cupertino,ST = CA,C = US SerialNumber:[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。

]

所以我從這個練習得到的推論是,由於jce本身需要MD5來驗證它的類用於簽名目的,我們無法從jre中刪除MD5算法,因此jre 1.6本身不能被FIPS 180-3投訴。

FIPS中的c#無法加載MD5。 請參閱針對啟用FIPS的系統的MD5是否存在備用哈希算法? 通過上面的測試,我猜java不能做那種行為。

如果有人通過觀察或任何我可能忽略的明顯錯誤反對,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM