【问题标题】:Wrong digest value using PHP使用 PHP 的错误摘要值
【发布时间】:2015-05-17 00:06:28
【问题描述】:

我有字符串:

$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) 的参考。

感谢您的帮助!

【问题讨论】:

标签: php xml soap digest


【解决方案1】:

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

因此,您需要在输入的内容上应用您命名的标准(规范形式、摘要)。

如果你懒得自己做,你可以使用一个现有的库来解析你所拥有的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"

【讨论】:

    【解决方案2】:

    在进行哈希之前,您需要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 值。我的是空的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2017-09-26
    • 2018-04-20
    • 2022-06-25
    • 2020-10-25
    • 1970-01-01
    相关资源
    最近更新 更多