来计算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提取了“Document” - 节点,但仍然得到了不同的值,然后计算了检查散列。
希望你们中有人有想法吗?
编辑:26.08.2013 - 更改(更正)xml文件的给定哈希值
答案 0 :(得分:1)
好的,我想告知解决方案,也许任何人都会找到这些话题:
必须从容器中以这种方式直接选择文档节点:
“XmlNodeList documentNodeList = sepaContainer.GetElementsByTagName(”Document“);”
然后第一个条目的外部xml必须被封装并转换为哈希。
也是第一个发布值:7DDB2138E8C91037DA7A6E9552478C59A2AACE26F8112EBC8012A8DE11592025 是错误的正确值将是38B862BD35B95D8CB20448153B5F6F73B3657EB1BC81CF11D3491D16EEA94009