XML DigestValue Пересчитать - PullRequest
       39

XML DigestValue Пересчитать

0 голосов
/ 03 октября 2018

Я получил правильно подписанный XML-файл, сгенерированный SoapUI.Приведенный ниже код является частью заголовка WSSE.

<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 = , но после моих вычислений равно sc6nLxoiPHloI1EMd u6cf = ufc =

Мой канонизированный элемент 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);

Пожалуйста, скажите мне, что я делаю неправильно.

1 Ответ

0 голосов
/ 04 октября 2018

Проблема решена - чтобы использовать C14N, нам нужно загрузить весь документ, а затем загрузить элемент body.C14N добавит некоторые атрибуты в тело из корневого тега.

$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);
...