6

我正在尝试在我的 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 库似乎使用 MD5 进行签名,但我检查了 jre/lib/ext/sunjce_provider.jar 签名者及其使用 sha1。

知道为什么我的代码因此错误而失败吗?

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

原因:java.lang.SecurityException:无法在 javax.crypto.SunJCE_b.(DashoA13*..) 上为受信任的 CA 设置证书 ... 3 更多

原因:java.lang.SecurityException:签名类已在 javax.crypto.SunJCE_b$1 的 javax.crypto.SunJCE_b.c(DashoA13*..) 的 javax.crypto.SunJCE_b.d(DashoA13*..) 处被篡改.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 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

所以我从这个练习中的推论是,由于 jce 本身需要 MD5 来验证其类以用于签名目的,我们不能从 jre 中删除 MD5 算法,因此 jre 1.6 本身不能成为 FIPS 180-3 投诉。

FIPS 中的 c# 无法加载 MD5。请参阅对于启用 FIPS 的系统,是否有替代 MD5 的散列算法?. 通过上面的测试,我猜 java 不能做到这一点。

如果有人通过观察或任何我可能忽略的明显错误反对,请告诉我。

于 2012-06-27T06:36:43.187 回答
0

我想我可能已经找出了根本原因,但仍然无法弄清楚它的来源。我尝试调试 X509CertImpl 并获得了一个使用 MD5 的“JCE Development”签名的证书。但是所有其他加载的证书都是使用 SHA1withDSA 正确签名的。我不确定这是否应该是 jre 上的错误。

[ [ 版本:V1 主题:CN=JCE Development,OU=Java Software,O=Sun Microsystems,L=Cupertino,ST=CA,C=US 签名算法:MD5withRSA,OID = 1.2.840.113549.1.1.4

Key: Sun RSA public key, 512 bits modulus: 9182591386680323574119504178341234548416270629561070323164514737894957593991212767744352158438329809500219147803751143974067780130174290713135793698837217 public exponent: 65537 Validity: [From: Thu Oct 31 20:57:44 IST 2002, To: Wed Oct 31 20:57:44 IST 2007] Issuer: CN=JCE开发,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.......

]

于 2012-06-27T06:28:05.903 回答