Wrong digest value using PHP
我有绳子:
1 | $string = '<Predstavitev xmlns="http://www.sigen.si/PodpisaniDokument" Id="MyVisualisation2"><Podatki ca="SIGEN-CA" dsPodjetja="" dsUporabnika="12345678" emso="1212912500444" maticna="" serial="2462933412018"/></Predstavitev>'; |
它的消化价值应该是
1 | tmLGK3IVc1mC/r5ScUKXQ46wcCA= |
但是当我使用这个PHP代码时
1 |
输出是
1 | yszGh284QybUiyVNLfQlkh358qQ= |
SOAP中引用了规范化方法(http://www.w3.org/tr/2001/rec-xml-c14n-20010315)和摘要法算法(http://www.w3.org/2000/09/xmldsig_sha1)。
谢谢你的帮助!
在进行散列之前,需要对字符串执行
只需将字符串添加到domdocument并从元素
1 2 3 4 5 6 7 8 9 10 11 12 | $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)); |
如果摘要值错误并且应用的函数正确,那么输入值是错误的——而不是摘要。摘要是正确的,从错误的输入值来看是正确的。
因此,您需要按照您在输入中命名的标准(规范形式、摘要)来应用这些标准。
如果您太懒了,不能自己做,那么您可以使用现有的库来解析SOAP响应XML中的算法:
1 2 3 4 5 | $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"。