RFC 2246 PRF функция в PHP
Я всюду искал реализацию функции PRF из RFC 2246. Я нашел три. Один здесь, один из библиотеки openSSL и один из wpa_supplicant. Все они дают разные результаты. Итак, мой первый вопрос: есть ли где-нибудь примерный ввод PRF и примерный вывод PRF?
Эта функция является частью подключения к веб-службе.NET (защищенной с помощью WS-Security) из PHP.
Что я нашел до сих пор это. Мой клиент сначала отправляет запрос на токен с именем пользователя / паролем и одноразовым номером - это RST. Сервер в своем RSTR отвечает другим одноразовым номером и маркером безопасности. Следующий запрос от моего клиента должен прийти с подписью, ключ которой получен из двух одноразовых номеров и "главного секрета". Этот производный ключ вычисляется в соответствии с RFC 2246. И поэтому мне нужна надежная его реализация.
Даже если у меня есть надежная реализация, что будет представлять собой параметры этой функции в контексте WS-Security? Функция PRF должна принимать три параметра, а именно:
секрет, этикетка, семя.
Я читал здесь, что Microsoft использует ярлык "WS-SecureConversationWS-SecureConversation", но эта статья была написана в 2006 году... Теперь, в чем секрет? Это оригинальный пароль? Знак безопасности? Комбинация тех? Наконец, что будет семенем? У меня есть два одноразовых номера - я их объединяю, ИЛИ их, XOR их?
Я серьезно застрял. Любая помощь с благодарностью.
1 ответ
Я боролся с этим в течение двух дней, но в конечном итоге я добился успеха. Это моя функция PHP psha1, которая основана на методе C#, найденном в ответ на "подписывание запроса SOAP-сообщения через ADFS". Возьмите RST и RSTR, base64_decode каждый и передайте их этой функции как $clientSecret и $serverSecret соответственно. Ответ токена должен содержать элемент KeySize, который можно передать как $sizeBits, если он не равен 256.
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);
}