java - 不支持的 SignatureMethod 算法,但该算法被 BC-Provider 列为可用服务

标签 java bouncycastle xml-signature

简单来说,我的问题如下:

我在函数的开头添加 BC-Provider:

Security.addProvider(new BouncyCastleProvider());

当我列出所有服务时

BouncyCastleProvider().getServices();

列表包含 “RIPEMD160WITHECDSA”

在此代码片段的最后一行:

XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM");
DOMValidateContext valContext = new DOMValidateContext(pubkeys[i], sigElement);
valContext.setURIDereferencer(new FileDereferencer(
                              factory.getURIDereferencer(), new File("D:\\eclipseworkspace\\pathtoxml.xml")));
javax.xml.crypto.dsig.XMLSignature xmlSignature = factory.unmarshalXMLSignature(valContext);

我收到一条异常消息:

不支持的 SignatureMethod 算法:http://www.w3.org/2007/05/xmldsig-more#ecdsa-ripemd160

这是什么意思? RIPEMD160WITHECDSA 和此 URL 指定的算法之间有什么区别? 或者 url 只是没有映射到这个算法名称?

这是堆栈跟踪:

javax.xml.crypto.MarshalException: unsupported SignatureMethod algorithm: http://www.w3.org/2007/05/xmldsig-more#ecdsa-ripemd160
    at org.jcp.xml.dsig.internal.dom.DOMSignatureMethod.unmarshal(Unknown Source)
    at org.jcp.xml.dsig.internal.dom.DOMSignedInfo.<init>(Unknown Source)
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.<init>(Unknown Source)
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshal(Unknown Source)
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshalXMLSignature(Unknown Source)
    at com.mobile.xmlsignature.XMLSigChecker.verify(XMLSigChecker.java:122)
    at com.mobile.xmlsignature.mainclass.main(mainclass.java:13)

最佳答案

看起来像ecdsa-ripemd160不是使用 DOMSignatureMethod 注册的默认签名方法之一。

根据XMLSignatureFactory.newSignatureMethod()您可以使用如下方式注册ecdsa-ripemd160:

xmlFact.newSignatureMethod(
    "http://www.w3.org/2007/05/xmldsig-more#ecdsa-ripemd160", 
     MyECDSARipemd160Provider());

您必须推出自己的 MyECDSARipemd160Provider() 类来实现 SignatureMethodParameterSpec它需要识别你的算法。我还没有尝试过这个,我怀疑这可能需要一些尝试和错误。我不知道是否有 BC 类(class)可以为您做到这一点。我假设 getAlgorithm()调用此类应返回“RIPEMD160WITHECDSA”。

关于java - 不支持的 SignatureMethod 算法,但该算法被 BC-Provider 列为可用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11984025/

相关文章:

java - 为什么我无法使用 JPA 连接数据库?

java - 在内部类之外声明 int 值

xml - 使用 OpenSAML 和 OpenSSO 的签名验证问题

java - Android PopupWindow 和 SeekBar 监听器没有响应

java - 用 Java 编写 imap 邮件服务器的库

java - QESeal LTV 验证

java - 从 RSA .pem 文件中获取私钥

java - Rijndael 256 加密 : Java and . NET 不匹配

xml - 跨浏览器 XmlDsig

java - BouncycaSTLe XmlSignatureFactory NoSuchAlgorithmException