Неверное значение дайджеста с использованием 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) и алгоритм метода дайджеста (http://www.w3.org/2000/09/xmldsig#sha1).

Спасибо за помощь!


person KMatko    schedule 14.03.2015    source источник
comment
Как вы узнали это tmLGK3IVc1mC/r5ScUKXQ46wcCA=?   -  person Benoit Esnard    schedule 14.03.2015
comment
Это написано в примере (storitve-ca.gov.si/Soap.xml)   -  person KMatko    schedule 14.03.2015


Ответы (2)


Если значение дайджеста неверно, а применяемые функции верны, то введенное значение неверно, а не дайджест. Дайджест верен в том смысле, что он верен из неправильного входного значения.

Следовательно, вам необходимо применить стандарты в том виде, в котором вы их назвали (каноническая форма, дайджест), к полученным входным данным.

Если вам лень делать это самостоятельно, вы можете, например, взять существующую библиотеку, которая может анализировать алгоритмы из 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".

person hakre    schedule 16.03.2015

Вам нужно canonicalize строку перед выполнением хеширования.

Просто добавьте строку в DomDocument и получите C14N из элемента 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));
person DieGoth74    schedule 30.08.2018
comment
Просто используйте значение $ string. Моя была пуста. - person DieGoth74; 30.08.2018