使用PHP错误的摘要值

时间:2015-03-14 15:00:48

标签: php xml soap digest

我有字符串:

$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)和摘要方法算法(http://www.w3.org/2000/09/xmldsig#sha1)的参考。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

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

因此,您需要应用标准,因为您已经在您输入的输入上命名了它们(规范形式,摘要)。

如果您懒得自己做,那么您可以使用现有的库,以便能够解析您所拥有的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 类是XMLUtil的一部分,也是packagist的一部分,只需要"hakre/xmlutil": "dev-develop"

答案 1 :(得分:0)

在进行哈希处理之前,您需要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));