Другое DigestValue для одного и того же XML-документа

1

Я подписал XML-документ здесь

Значение дайджеста документа - 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);
    }
Теги:
xml-dsig

1 ответ

0

Я столкнулся с этой проблемой, и это связано с тем, как SignedXml создает хеш-дайджест. В.NET 4 он полностью игнорирует любые пробелы в XML.

SignedXml.CheckSignature не работает в.NET 4, но работает в.NET 3.5, 3 или 2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню