【问题标题】:Different DigestValue for the same XML document同一个 XML 文档的不同 DigestValue
【发布时间】:2014-09-14 13:02:52
【问题描述】:

我已经签署了xml文档here

文档的摘要值为atHP855e32qDMu4fzAZr+wXRqfeLh9HTpnAlAFy/jDg= 当我尝试使用下面的代码检查它时,结果是 Ppk6zE8XY4zaIPco/fY/sSKog3imkmko8CMAIHVNwTw= 我认为问题出在包含空格的 Body 标记中。如果在没有空格的情况下签署此文档,则摘要值相等。

谁能发现错误?

public static byte[] GetDigest(XmlDocument doc)
    {
        var nodeList = doc.GetElementsByTagName(
          "Signature", "http://www.w3.org/2000/09/xmldsig#");

        var signedXml = new SignedXml(doc);
        signedXml.LoadXml((XmlElement)nodeList[0]);

        var signatureDescription = CryptoConfig.CreateFromName(signedXml.SignedInfo.SignatureMethod) as SignatureDescription;
        var hashAlgorithm = signatureDescription.CreateDigest();

        var xmlDocument = new XmlDocument
        {
            PreserveWhitespace = true
        };

        var body = doc.SelectSingleNode("/ReportEnvelope/Body");

        XmlNodeList transformNode = ((XmlElement)(nodeList[0])).GetElementsByTagName("Transform");

        xmlDocument.AppendChild(xmlDocument.ImportNode(body, true));

        var transform = signedXml.SignedInfo.CanonicalizationMethodObject;
        transform.LoadInnerXml(transformNode);
        transform.LoadInput(xmlDocument);
        return transform.GetDigestedOutput(hashAlgorithm);
    }

【问题讨论】:

    标签: c# xml-dsig


    【解决方案1】:

    我也遇到了这个问题,它与 SignedXml 如何创建哈希摘要有关。在 .NET 4 中,它完全忽略了 XML 中的任何空格。

    SignedXml.CheckSignature fails in .NET 4 but it works in .NET 3.5, 3 or 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多