使用 PHP 的错误摘要值

Wrong digest value using PHP

我有字符串:

$string = '<Predstavitev xmlns="http://www.sigen.si/PodpisaniDokument" Id="MyVisualisation2"><Podatki ca="SIGEN-CA" dsPodjetja="" dsUporabnika="12345678" emso="1212912500444" maticna="" serial="2462933412018"/></Predstavitev>';

它的摘要值应该是

tmLGK3IVc1mC/r5ScUKXQ46wcCA=

但是当我使用这个PHP代码时

echo base64_encode(hash('SHA1', $string, true));

输出是

yszGh284QybUiyVNLfQlkh358qQ=

在 SOAP 中是规范化方法的参考 (http://www.w3.org/TR/2001/REC-xml-c14n-20010315) and digest method algorithm (http://www.w3.org/2000/09/xmldsig#sha1)。

感谢帮助!

如果摘要值错误且应用的函数正确,则输入值错误 - 而不是摘要。从错误的输入值来看,摘要是正确的。

因此,您需要在输入的内容上应用您命名的标准(规范形式、摘要)。

如果你懒得自己做,你可以使用一个现有的库来解析算法 soap-response XML 你有:

$string = '<Predstavitev xmlns="http://www.sigen.si/PodpisaniDokument" Id="MyVisualisation2"><Podatki ca="SIGEN-CA" dsPodjetja="" dsUporabnika="12345678" emso="1212912500444" maticna="" serial="2462933412018"/></Predstavitev>';

$sig = new XMLDSig($soapResponse);

var_dump($sig->getDigest($string)); // string(28) "tmLGK3IVc1mC/r5ScUKXQ46wcCA="

XMLDSig class 是 XMLUtil, also on packagist, just require "hakre/xmlutil": "dev-develop" 的一部分。

在进行哈希之前,您需要 canonicalize 字符串。

只需将字符串添加到 DomDocument 并从元素 Predstavitev:

中获取 C14N
$string = '<Predstavitev xmlns="http://www.sigen.si/PodpisaniDokument"     
Id="MyVisualisation2"><Podatki ca="SIGEN-CA" dsPodjetja="" 
dsUporabnika="12345678" emso="1212912500444" maticna="" 
serial="2462933412018"/></Predstavitev>';

$xml = new DomDocument();

$xml->loadXML($string);

$node = $xml->getElementsByTagName('Predstavitev');

echo base64_encode(hash('SHA1', $node->item(0)->C14N(), true));