【问题标题】:Is certificates's hash algorithm really taken to account in XMLDSig?XMLDSig 中是否真的考虑了证书的哈希算法?
【发布时间】:2015-05-24 16:39:26
【问题描述】:

我有两个 pkcs12 容器,其中一个具有 sha1 哈希算法,另一个具有 sha256。

我正在使用标准方式签署 xml:

 String signMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
 String digestMethod = "http://www.w3.org/2001/04/xmlenc#sha256";
 if (doc.getFirstChild() != null) {
     doc.getFirstChild().appendChild(sig.getElement());
     Transforms transforms = new Transforms(doc);
     transforms.addTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature");
     transforms.addTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments");
     sig.addDocument("", transforms, digestMethod);
     sig.addKeyInfo((X509Certificate) cert);
     sig.sign(privateKey);
  }

我用“sha1 key”签署了一些xml,但在代码sha-256中指定(检查signMethod和digestMethod变量)并且验证结果是OK的。看起来签名和验证程序从适当的 xml 标签中获取算法名称,这听起来不错,但是 如果没有意义,在 p12 文件中指定签名哈希算法有什么意义

唯一的解释是创建 PKCS7 签名,其中通常不指定哈希算法,它可能取自 p12。

所以,我的假设如下:

在 xml 签名标签值很重要(在转换中指定),p12 哈希算法无关紧要。在 pkcs7 或其他开发人员未指定哈希算法的情况下,它取自 p12。我说的对吗?

【问题讨论】:

    标签: java xml hash xml-signature


    【解决方案1】:

    您没有在此处指定证书的哈希算法。那已经指定了。您正在指定用于签名的哈希算法。

    【讨论】:

    • 如果我理解正确,您是说证书中的哈希算法不是用于消化签名,而是用于消化其他内容。但是那个签名哈希算法的目的是什么?我故意把它写成粗体,因为它是从 p12 生成的 .cer 文件中引用的。
    • 证书中的哈希算法描述了证书自身的签名。不是您正在创建的数字签名。
    • 感谢您的澄清。现在我将其理解为“用于证书链(CA)检查的算法”,并且很可能是正确的。只是一个善意的建议 - 我接受了你的回答,但对于“下一代”来说,通过将“签名”明确更改为“证书签名”来编辑答案会很有用。我不想改变任何东西,因为我不是 100% 有信心,也不想“破坏”你的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2012-07-19
    • 2019-02-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多