У меня есть строка:
$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).
Спасибо за помощь!
Если значение дайджеста неверно и применяемые функции верны, то вводимое значение неверно — а не дайджест. Дайджест правильный в том смысле, что он верен из-за неправильного входного значения.
Поэтому вам нужно применять стандарты в том виде, в котором вы их назвали (каноническая форма, дайджест), на входе, который вы получили.
Если вам лень делать это самостоятельно, вы можете, например, взять существующую библиотеку, которая может анализировать алгоритмы из 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».
Вам нужно 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));