使用 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));
我有字符串:
$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
:
$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));