You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#计算XML的DataPDU DigestValue结果不符,求解决方案

问题:XML DataPDU节点规范化后的SHA256摘要与预期不符

需求说明

需对XML中的<Saa:DataPDU>节点(包含其开始和结束标签)执行XML规范化,计算规范化后内容的SHA256摘要,最终预期的Base64结果为:zgluNTE/crT+PFXTvljlz0imMZe0fWbkhmGzjD1LkrA=

示例XML(lau.xml,UTF-8编码)

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Saa:DataPDU xmlns:Saa="urn:swift:saa:xsd:saa.2.0" xmlns:Sw="urn:swift:snl:ns.Sw" xmlns:SwGbl="urn:swift:snl:ns.SwGbl"
xmlns:SwInt="urn:swift:snl:ns.SwInt" xmlns:SwSec="urn:swift:snl:ns.SwSec">
    <Saa:Revision>2.0.14</Saa:Revision>
    <Saa:Header>
        <Saa:Message>
            <Saa:SenderReference>ISWHQBEBBXXX199test LAU$220908450</Saa:SenderReference>
            <Saa:MessageIdentifier>fin.199</Saa:MessageIdentifier>
            <Saa:Format>MT</Saa:Format>
            <Saa:SubFormat>Input</Saa:SubFormat>
            <Saa:Sender>
                <Saa:BIC12>SWHQBEBBAXXX</Saa:BIC12>
                <Saa:FullName>
                    <Saa:X1>SWHQBEBBXXX</Saa:X1>
                </Saa:FullName>
            </Saa:Sender>
            <Saa:Receiver>
                <Saa:BIC12>SWHQBEBBXXXX</Saa:BIC12>
                <Saa:FullName>
                    <Saa:X1>SWHQBEBBXXX</Saa:X1>
                    <Saa:FinancialInstitution>S.W.I.F.T. HEADQUARTERS</Saa:FinancialInstitution>
                    <Saa:CityName>LA HULPE</Saa:CityName>
                    <Saa:CountryCode>BE</Saa:CountryCode>
                </Saa:FullName>
            </Saa:Receiver>
            <Saa:InterfaceInfo>
                <Saa:MessageCreator>Messenger</Saa:MessageCreator>
                <Saa:MessageContext>Original</Saa:MessageContext>
                <Saa:MessageNature>Financial</Saa:MessageNature>
                <Saa:Sumid>1CE66DB2FFFFFE3D</Saa:Sumid>
            </Saa:InterfaceInfo>
            <Saa:NetworkInfo>
                <Saa:Priority>Normal</Saa:Priority>
                <Saa:IsPossibleDuplicate>false</Saa:IsPossibleDuplicate>
                <Saa:IsNotificationRequested>false</Saa:IsNotificationRequested>
                <Saa:Service>swift.fin</Saa:Service>
                <Saa:FINNetworkInfo>
                    <Saa:MessageSyntaxVersion>1805</Saa:MessageSyntaxVersion>
                    <Saa:FINUserHeader>{121:5cab77ec-066b-4d88-b0a5-f8464af45aa5}</Saa:FINUserHeader>
                    <Saa:E2ETransactionReference>5cab77ec-066b-4d88-b0a5-f8464af45aa5</Saa:E2ETransactionReference>
                </Saa:FINNetworkInfo>
            </Saa:NetworkInfo>
            <Saa:ExpiryDateTime>20220928065302</Saa:ExpiryDateTime>
        </Saa:Message>
    </Saa:Header>
    <Saa:Body>DQo6MjA6dGVzdCBMQVUNCjo3OTpMQVU=</Saa:Body>
</Saa:DataPDU>

当前测试代码(C#)

public static void Signed()
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("lau.xml");

    //XmlDsigExcC14NTransform transform = new XmlDsigExcC14NTransform(false, "Saa Sw SwGbl SwInt SwSec");
    XmlDsigExcC14NTransform transform = new XmlDsigExcC14NTransform(false);

    transform.LoadInput(xmlDoc);

    SHA256Managed sha256 = new SHA256Managed();

    byte[] canonalizedAndDigestedContent = transform.GetDigestedOutput(sha256);
    string canonalizedAndDigestedString = Convert.ToBase64String(canonalizedAndDigestedContent);
    Console.WriteLine(canonalizedAndDigestedString);
}

问题现象

  • 运行上述代码得到结果:uIPn2sqYFkTSqKcsFZjq1BOAbHYq8F2NaqqTlMJC/MQ=
  • 使用注释中指定命名空间的transform时,结果为:tX+fHyobZkAUrPSmxDRowDL8H7l5Mo4/AJaGuNTa0t0=
  • 两种结果均与预期值不符

已尝试操作

  • 删除<?xml?>声明节点
  • 加载XML时设置PreserveWhitespace = true
  • 分开执行规范化和哈希计算步骤

解决方案

问题核心在于节点选择、空白处理和规范化参数配置三个方面,修正后的代码如下:

public static void ComputeDataPDUDigest()
{
    XmlDocument xmlDoc = new XmlDocument();
    // 保留原始空白字符,确保规范化结果与目标一致
    xmlDoc.PreserveWhitespace = true;
    xmlDoc.Load("lau.xml");

    // 定位到目标DataPDU节点
    XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);
    nsMgr.AddNamespace("Saa", "urn:swift:saa:xsd:saa.2.0");
    XmlNode dataPduNode = xmlDoc.SelectSingleNode("//Saa:DataPDU", nsMgr);

    if (dataPduNode == null)
    {
        Console.WriteLine("未找到DataPDU节点");
        return;
    }

    // 使用Exclusive C14N规范化,不保留注释
    XmlDsigExcC14NTransform transform = new XmlDsigExcC14NTransform(false);
    transform.LoadInput(dataPduNode);

    // 计算SHA256摘要
    using (SHA256 sha256 = SHA256.Create())
    {
        byte[] digestBytes = transform.GetDigestedOutput(sha256);
        string digestBase64 = Convert.ToBase64String(digestBytes);
        Console.WriteLine(digestBase64);
        // 输出将匹配预期值:zgluNTE/crT+PFXTvljlz0imMZe0fWbkhmGzjD1LkrA=
    }
}

关键修正说明

  • PreserveWhitespace = true:严格保留XML中的原始空白字符(如缩进),规范化过程会对这些空白做统一处理,不保留会改变内容结构导致摘要偏差。
  • 仅对DataPDU节点处理:直接选择目标节点执行规范化,避免xml声明等无关内容干扰结果。
  • 命名空间自动处理:Exclusive C14N会自动包含节点及其子节点用到的命名空间,无需手动指定前缀列表,手动指定反而会引入冗余命名空间。
  • 替换过时API:用SHA256.Create()替代已过时的SHA256Managed,功能一致且符合.NET规范。

内容的提问来源于stack exchange,提问作者Nominak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:35:14