xml — неверное значение дайджеста при переполнении стека

У меня есть строка:

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

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

0

Решение

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

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

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

0

Другие решения

Вам нужно 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));
0

По вопросам рекламы [email protected]