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);
}
Другие вопросы по тегам