3

在“DFÜ 协议”的规范中描述了通过 SHA256 计算 SEPA 容器支付文件的哈希值。

哈希值是使用整个包含的文档创建的,包括打开和关闭“文档”标签。

该文档根据 Canonical XML 1.0 版进行了规范化。(http://www.w3.org/TR/2001/REC-xml-c14n-20010315)。

在包含文档的情况下,还必须根据主文档执行规范化。

SHA-256 用作哈希算法。

哈希值在标签中以十六进制形式输入,大写字符用于十六进制数字 A 到 F。在 SRZ 过程中使用 XML 容器时,必须指定哈希值(缩写 SRZ 代表德语术语“Servicerechenzentrum”的意思是“数据处理服务中心”)。

我尝试了不同的方法来做到这一点,但我无法获得正确的值。

    [Test]
    public void GetHashTest()
    {
        // load document
        XmlDocument sepaContainer = new XmlDocument();
        sepaContainer.PreserveWhitespace = true;
        sepaContainer.Load("PathToFile");

        // do canonical 
        XmlDsigC14NTransform transformer = new XmlDsigC14NTransform();
        transformer.LoadInput(document);

        string compare = string.Empty;
        foreach (byte b in transformer.GetDigestedOutput(new SHA256Managed()))
        {
            compare += b.ToString("X2");
        }

        Assert.That(compare, Is.EqualTo("1FA8EE4F1E9551C82E1C7A82A88140325453A52BD08FF9FA5D13CA40F04AB305"));
    }

也无法将文件读入字符串并计算:

    private string GetSHA256(string text)
    {
        UTF8Encoding UE = new UTF8Encoding();
        byte[] message = UE.GetBytes(text);

        SHA256Managed hashString = new SHA256Managed();
        string hex = string.Empty;

        byte[] hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hex += string.Format("{0:X2}", x);
        }

        return hex;
    }

目前我从这里使用 SEPA XML 容器:http: //entwickler-forum.de/showthread.php/64499-Auslesen-einer-XML-Datei

<?xml version="1.0" encoding="UTF-8"?>
<conxml xmlns="urn:conxml:xsd:container.nnn.002" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:conxml:xsd:container.nnn.002 container.nnn.002.xsd">
  <CreDtTm>2010-10-26T14:48:17Z</CreDtTm>
  <MsgPain008>
    <HashValue>38B862BD35B95D8CB20448153B5F6F73B3657EB1BC81CF11D3491D16EEA94009</HashValue>
    <HashAlgorithm>SHA256</HashAlgorithm>
    <Document xmlns="urn:swift:xsd:$pain.008.002.01">
      <pain.008.001.01>
        <GrpHdr>
          <MsgId>D004201010261648081</MsgId>
          <CreDtTm>2010-10-26T14:48:08Z</CreDtTm>
          <NbOfTxs>1</NbOfTxs>
          <CtrlSum>0.20</CtrlSum>
          <Grpg>MIXD</Grpg>
          <InitgPty>
            <Nm>Testauftraggeber SEPA-LS</Nm>
          </InitgPty>
        </GrpHdr>
        <PmtInf>
          <PmtInfId>D00420101024444444081</PmtInfId>
          <PmtMtd>DD</PmtMtd>
          <PmtTpInf>
            <SvcLvl>
              <Cd>SEPA</Cd>
            </SvcLvl>
            <LclInstrm>
              <Cd>CORE</Cd>
            </LclInstrm>
            <SeqTp>OOFF</SeqTp>
          </PmtTpInf>
          <ReqdColltnDt>2010-11-02</ReqdColltnDt>
          <Cdtr>
            <Nm>Testauftraggeber SEPA-LS</Nm>
          </Cdtr>
          <CdtrAcct>
            <Id>
              <IBAN>DE352505018444402014</IBAN>
            </Id>
          </CdtrAcct>
          <CdtrAgt>
            <FinInstnId>
              <BIC>SPKHDE2HXXX</BIC>
            </FinInstnId>
          </CdtrAgt>
          <ChrgBr>SLEV</ChrgBr>
          <DrctDbtTxInf>
            <PmtId>
              <EndToEndId>Lastschriftreferenz 002</EndToEndId>
            </PmtId>
            <InstdAmt Ccy="EUR">0.20</InstdAmt>
            <DrctDbtTx>
              <MndtRltdInf>
                <MndtId>Mandat002</MndtId>
                <DtOfSgntr>2010-10-26</DtOfSgntr>
                <AmdmntInd>false</AmdmntInd>
              </MndtRltdInf>
              <CdtrSchmeId>
                <Id>
                  <PrvtId>
                    <OthrId>
                      <Id>DE98ZZZ09999999999</Id>
                      <IdTp>SEPA</IdTp>
                    </OthrId>
                  </PrvtId>
                </Id>
              </CdtrSchmeId>
            </DrctDbtTx>
            <DbtrAgt>
              <FinInstnId>
                <BIC>SPKHDE2HXXX</BIC>
              </FinInstnId>
            </DbtrAgt>
            <Dbtr>
              <Nm>Test Zahlungspflichtiger</Nm>
            </Dbtr>
            <DbtrAcct>
              <Id>
                <IBAN>DE132505018005555552</IBAN>
              </Id>
            </DbtrAcct>
            <UltmtDbtr>
              <Nm>Test Miete</Nm>
            </UltmtDbtr>
            <RmtInf>
              <Ustrd>Test SEPA-LS Einzug durch 10002014 Zahlungspflichtiger 10002022</Ustrd>
            </RmtInf>
          </DrctDbtTxInf>
        </PmtInf>
      </pain.008.001.01>
    </Document>
  </MsgPain008>
</conxml>

我手动和 xpath 提取了“文档”节点,但仍然得到不同的值,然后计算校验哈希。

希望你们中的任何人有一个想法?

编辑:26.08.2013 - 更改(更正)xml 文件的给定哈希值

4

1 回答 1

1

好的,我想告知解决方案,也许任何人都会找到这些主题:
文档节点必须以这种方式直接从容器中选择:“XmlNodeList documentNodeList = sepaContainer.GetElementsByTagName("Document");”

然后必须将第一个条目的外部 xml 规范化并转换为哈希。

也是第一个发布的值: 7DDB2138E8C91037DA7A6E9552478C59A2AACE26F8112EBC8012A8DE11592025 是错误的,正确的值将是 38B862BD35B95D8CB20448153B5F6F73B3657EB1BC81CF10091D16EEA9

于 2013-08-23T09:00:51.257 回答