我正在尝试在我的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。
知道为什么我的代码失败并出现此错误?
线程“main”java.lang.ExceptionInInitializerError中的异常 在javax.crypto.Cipher.getInstance(DashoA13 * ..) 在TestRemoveMD5.main(TestRemoveMD5.java:20)
引起:java.lang.SecurityException:无法为受信任的CA设置证书 在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个
答案 0 :(得分:1)
这是一项安全功能,可防止不受信任的代码删除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.*"; };
答案 1 :(得分:0)
我想我可能已经找到了根本原因,但仍然没有弄清楚它的来源。我试图调试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
密钥:Sun RSA公钥,512位 模数:9182591386680323574119504178341234548416270629561070323164514737894957593991212767744352158438329809500219147803751143974067780130174290713135793698837217 公共指数:65537 有效期:[来自:Thu Oct 31 20:57:44 IST 2002, 致:10月31日星期三20:57:44 IST 2007] 发行人:CN = JCE Development,OU = Java Software,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)y.t .... 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。
答案 2 :(得分:0)
所以我从这个练习中得出的结论是,由于jce本身需要MD5来验证它的类用于签名,我们不能从jre中删除MD5算法,因此jre 1.6本身不能被FIPS 180-3投诉。
FIPS中的c#无法加载MD5。请参阅Is there an alternate hashing algorithm to MD5 for FIPS-enabled systems?。通过上述测试,我猜java无法做到这一点。如果有人反对通过观察或任何可能忽略的明显错误,请告诉我。