我有字符串:
$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)的参考。
感谢您的帮助!
答案 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));