java - BouncyCaSTLe - 为算法设置自定义别名

标签 java digital-signature bouncycastle

我正在尝试使用 Bouncy CaSTLe 验证签名摘要。 摘要算法为SHA1。

不幸的是,摘要算法在签名中设置为 SHA1WITHRSA(这不是摘要算法),而不仅仅是 SHA1。

我对此无能为力。

现在我需要告诉 Bouncy CaSTLe 在遇到 SHA1WITHRSA 作为摘要算法时使用 SHA1。

是否可以添加导致 SHA1 摘要算法的别名?

我尝试过这个:

BouncyCastleProvider bcp = new BouncyCastleProvider();
bcp.put("Alg.Alias.MessageDigest.SHA1WITHRSA", "SHA-1");
bcp.put("Alg.Alias.MessageDigest.1.2.840.113549.1.1.5", "SHA-1");
Security.addProvider(bcp);

MessageDigest.getInstance("SHA1WITHRSA", "BC"); // throws an exception
MessageDigest.getInstance("1.2.840.113549.1.1.5", "BC"); // throws an exception

但是没有成功.. 我收到 java.security.NoSuchAlgorithmException。

完整的堆栈在这里:

no such algorithm: SHA1WITHRSA for provider BC
java.security.NoSuchAlgorithmException: no such algorithm: SHA1WITHRSA for provider BC
    at sun.security.jca.GetInstance.getService(GetInstance.java:87)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
    at java.security.Security.getImpl(Security.java:698)
    at java.security.MessageDigest.getInstance(MessageDigest.java:227)
    at com.company.Main.testAddDigest(Main.java:82)
    at com.company.Main.main(Main.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

1.2.840.113549.1.1.5 相同

no such algorithm: 1.2.840.113549.1.1.5 for provider BC
java.security.NoSuchAlgorithmException: no such algorithm: 1.2.840.113549.1.1.5 for provider BC
    at sun.security.jca.GetInstance.getService(GetInstance.java:87)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
    at java.security.Security.getImpl(Security.java:698)
    at java.security.MessageDigest.getInstance(MessageDigest.java:227)
    at com.company.Main.testAddDigest(Main.java:95)
    at com.company.Main.main(Main.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

不存在这样的摘要算法 SHA1WITHRSA,这使得抛出异常是正确的。 但我认为通过添加“put”行,将添加别名,然后 SHA1WITHRSA 将被识别为 SHA1 摘要算法。

更新:当我使用提供程序的特定实例时它正在工作:

MessageDigest.getInstance("SHA1WITHRSA", bcp);

我不确定如何将别名添加到 BC 的所有实例,而不仅仅是创建的 bcp 变量 (BouncyCaSTLeProvider)。如果可能的话。

最佳答案

所以,我已经弄清楚了。

我不确定有人会遇到这样的情况,但是..

问题是我正在使用DSS( https://github.com/esig/dss ,用于处理数字签名的框架)。 它使用Bouncy CaSTLe。 我正在一个特定的 PDF 上进行测试,该 PDF 的摘要算法属性设置为 SHA1withRSA(这是不正确的,应该只有 SHA1)。 但任务是处理它,因为它设置了正确的值 - SHA1

因此,我需要告诉充气城堡在遇到设置为摘要算法的 SHA1withRSA 时使用 SHA1

我不想过多修改框架代码(理想情况下根本不想),而且我当然不想修改任何 Bouncy CaSTLe 代码。

以下代码解决了这个问题:

BouncyCastleProvider bcp = (BouncyCastleProvider)Security.getProvider("BC");
bcp.addAlgorithm("Alg.Alias.MessageDigest.SHA1WITHRSA", "SHA-1");
bcp.addAlgorithm("Alg.Alias.MessageDigest.1.2.840.113549.1.1.5", "SHA-1");

只要 SHA1WITHRSA1.2.840.113549.1.1.5 设置为摘要算法,它就会获取 Bouncy CaSTLe 提供程序,并添加两个路由到 SHA-1 摘要算法的别名(他们不是!)。

有人可能会说这样的 PDF 不应该被验证,但那是另一回事..

关于java - BouncyCaSTLe - 为算法设置自定义别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38740206/

相关文章:

java - Android 中的 SQLite “after update” 触发器似乎不会在每次记录更新后运行

c# - PDF 证书过期后的数字签名验证

java - 数字签名验证,所选证书有错误,无法使用

ssl - HTTPS 通信中的根 CA、中间证书和 Web 服务器证书

c# - 如何仅从比特币签名中获取 ECDSA 公钥? ... SEC1 4.1.6 (mod p) 域上曲线的 key 恢复

java - 导入时出现 Google Drive 错误

java - DataOutputStream.writeBytes 添加零字节

java - 无法解析符号 'Immutable'

java - SpongycaSTLe 提供程序无法在 Android 上运行

C# 如何简单地使用 openPGP key 加密字符串