【问题标题】:XML DigestValue Re-calculateXML DigestValue 重新计算
【发布时间】:2018-10-03 13:26:46
【问题描述】:

我得到了由 SoapUI 生成的正确签名的 XML 文件。下面的代码是 WSSE Header 的一部分。

<ds:Reference URI="#id-AF3B7DA5121961AAD81538052175642352">
       <ds:Transforms>
         <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
         <ec:InclusiveNamespaces PrefixList="k20 k201 v20 v201 v202 w" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
       </ds:Transform>
    </ds:Transforms>
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <ds:DigestValue>1rHcIC43O2CYNQesaNK/uQpnJ8M=</ds:DigestValue>
</ds:Reference>

我们可以看到 DigestValue 等于 1rHcIC43O2CYNQesaNK/uQpnJ8M= 但经过我的计算后等于 sc6nLxoiPHloI1X/ufbMEMFEd6c=

我的规范化 Body 元素 (c14n) 如下所示:

<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-AF3B7DA5121961AAD81538052175642352"><v20:WyszukanieReceptWystawiajacegoRequest><kryteriaWyszukiwaniaRecept></kryteriaWyszukiwaniaRecept></v20:WyszukanieReceptWystawiajacegoRequest></soapenv:Body>

我正在用 PHP 编写。要计算我正在使用的 DigestValue:

$canonicalizedXml = $doc->C14N(true, false, null, ['k20', 'k201', 'v20', 'v201', 'v202', 'w']);
$hash = sha1($canonicalizedXml, true);
$digestValue = base64_encode($hash);

请告诉我我做错了什么。

【问题讨论】:

    标签: php xml soap digital-signature wsse


    【解决方案1】:

    问题已解决 - 要使用 C14N,我们需要加载整个文档,然后加载正文元素。 C14N 会从根标签向 body 添加一些属性。

    $bodyNode = $doc->getElementsByTagName('Body')->item(0);
    $canonicalizedXml = $bodyNode->C14N(true, false, null, ['k20', 'k201', 'v20', 'v201', 'v202', 'w']);
    $hash = sha1($canonicalizedXml, true);
    $digestValue = base64_encode($hash);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2011-10-15
      相关资源
      最近更新 更多