мы пытаемся реализовать функцию P_SHA1, это означает PHP. Шаблон функции, написанный на Python. Но, к сожалению, что-то не работает должным образом. Вот функция реализации в JAVA: http://ws.apache.org/wss4j/xref/org/apache/ws/security/conversation/dkalgo/P_SHA1.html
наш код:
<?php $newSeed = $label . $seed; // concat as strings // $p_sha1 $psha1 = p_hash('sha1', $secret, $newSeed, $length); $string = arrayToBytes($psha1); /** * P_SHA1 crypto alg calculation * * @return array of bytes - key **/ function p_hash($algo, $secret, $seed, $length) { $bytes = array_fill(0, $length, 0); $tmp = null; $A = $seed; $index = 0; while (1) { // hmac sha1: secret + seed $A = hash_hmac($algo, $secret, $A, true); // hmac sha1: secret + 1st hash + seed $output = hash_hmac($algo, $secret, ($A . $seed), true); foreach (bytesToArray($output) as $c) { if ($index >= $length) { return $bytes; } $bytes[$index] = $c; $index++; } } return $bytes; } function bytesToArray($bytes) { return unpack('C*', $bytes); } function arrayToBytes($array) { return call_user_func_array("pack", array_merge(array("C*"), $array)); } ?>
Может, кто-то знает, где я могу найти готовое решение? Или любой может помочь заставить скрипт работать правильно?
Это основано на методе C #, включенном в ответ на «Подписание запроса SOAP-сообщения через ADFS» . Я успешно использовал его для подписывания SOAP-запросов и получения ответа, который я хочу.
function psha1($clientSecret, $serverSecret, $sizeBits = 256) { $sizeBytes = $sizeBits / 8; $hmacKey = $clientSecret; $hashSize = 160; // HMAC_SHA1 length is always 160 $bufferSize = $hashSize / 8 + strlen($serverSecret); $i = 0; $b1 = $serverSecret; $b2 = ""; $temp = null; $psha = array(); while ($i < $sizeBytes) { $b1 = hash_hmac('SHA1', $b1, $hmacKey, true); $b2 = $b1 . $serverSecret; $temp = hash_hmac('SHA1', $b2, $hmacKey, true); for ($j = 0; $j < strlen($temp); $j++) { if ($i < $sizeBytes) { $psha[$i] = $temp[$j]; $i++; } else { break; } } } return implode("", $psha); }
Важно отметить, что секрет клиента и секрет сервера должны быть декодированы base64 перед передачей этой функции.
Вы должны были упомянуть, что это реализация « WS-SecureConversation 1.3 » и что это не SHA1, очевидно, а скорее вариант HMAC-SHA1 с особенностями протокола.
Получается что-то от TLS (RFC 2246) :
Мы используем подмножество механизма, определенного для TLS в RFC 2246. В частности, мы используем функцию P_SHA-1 для генерации последовательности байтов, которая может использоваться для генерации ключей безопасности.
Вы не первый, чтобы спросить, например, этот вопрос без ответа. Функция RFF 2246 PRF в PHP
Вы ищете готовую функцию SHA1 или что-то еще? Это даст вам хэш SHA1, и если вы поместите значение true во второй аргумент, он даст вам его в двоичном формате. В противном случае, это даст вам в шестнадцатеричном виде