2013-04-12 25 views
2

我一直在尋找遍佈RFC 2246的PRF函數的實現。我找到了三個。一個是here,一個來自openSSL庫,另一個來自wpa_supplicant。他們都返回不同的結果。所以我的第一個問題是:是否有示例PRF輸入和樣本PRF輸出?RFC 2246 PRF函數在PHP中

該函數是連接到PHP的.NET Web服務(受WS-Security保護)的一部分。

我到目前爲止發現的是這個。我的客戶端首先發送一個令牌請求,其中包含一個用戶名/密碼和一個隨機數 - 這是一個RST。該服務器在其RSTR中以另一個隨機數和安全令牌進行響應。我的客戶的下一個請求應該帶有一個簽名,其密鑰來源於兩個隨機數和一個「主密鑰」。該派生密鑰是根據RFC 2246計算的。這就是爲什麼我需要可靠的實現它。

即使我有一個可靠的實現它,在WS-Security的上下文中構成該函數的參數是什麼? PRF功能應具有三個參數,即:

祕密,標籤,種子。

我讀過here,Microsoft使用的標籤是「WS-SecureConversationWS-SecureConversation的」,但文章寫於2006年。現在,會是什麼祕密?它是原始密碼嗎?安全令牌?這些的組合?最後,什麼是種子?我有兩個隨機數 - 我連接它們,或者它們,XOR它們?

我被嚴重卡住了。任何幫助不勝感激。

回答

0

我爲此奮鬥了兩天,但我最終取得了成功。這是我的PHP psha1函數,它基於在a reply to "signing SOAP message request via ADFS"處找到的C#方法。把你的RST和RSTR,base64_decode分別作爲$ clientSecret和$ serverSecret分別傳遞給這個函數。令牌響應應該帶有一個KeySize元素,如果它不等於256,則可以將其傳遞爲$ sizeBits。

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); 
} 
+0

太酷了!你搖滾! – Serg