关于xml:使用PHP的错误摘要值

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
echo base64_encode(hash('SHA1', $string, true));

输出是

1
yszGh284QybUiyVNLfQlkh358qQ=

SOAP中引用了规范化方法(http://www.w3.org/tr/2001/rec-xml-c14n-20010315)和摘要法算法(http://www.w3.org/2000/09/xmldsig_sha1)。

谢谢你的帮助!


在进行散列之前,需要对字符串执行canonicalize

只需将字符串添加到domdocument并从元素Predstavitev中获取c14n即可:

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"。