2017-08-04 89 views
0

爲了產生用於一個API連接認證頭,我的代碼應遵循下列步驟:PHP字符串作爲字節數組,然後散列base64編碼

  1. 創建表格[獨特]的字符串:[apikey]。
  2. 使用UTF-8編碼將字符串從步驟1轉換爲字節數組。
  3. 計算步驟2中字節數組的SHA-256散列值。
  4. Base64對步驟3中計算的字節數組進行編碼;這個字符串將是認證密鑰。

據我所知,php 中的字符串是字節數組,所以我的初始方法如下所示。

public function generateAuthKey() 
{ 
    $unique = uniqid(); # unique string 
    $string = $unique.':'.$this->apiKey; # step 1 
    $string = utf8_encode($string); # step 2 ? 
    $hash = hash('sha256', $string); # step 3 
    $base64 = base64_encode($hash); # step 4 

    return $base64; 
} 

我嘗試使用此身份驗證密鑰進行連接的應用程序將收到403錯誤。

上面的代碼是否完成了所需的步驟(也許在我的api鍵中有錯誤)或者是否有其他方法在php中遵循創建授權密鑰的步驟?

+0

我認爲它工作正常:-https://eval.in/841537 –

回答

4

是的,PHP 中的字符串是已經是字節數組。除非你的$string包含任何非ASCII字符,它也已經是有效的UTF-8(UTF-8是ASCII的超集)。所以你可以跳過「編碼爲UTF-8」的步驟。

該算法可能希望散列的輸出爲二進制,然後您應該將其轉換爲基數64.默認情況下,hash返回十六進制值,而不是二進制。爲此,您需要設置其第三個參數。總結:

$unique = uniqid(); 
$string = $unique . ':' . $this->apiKey; 
$hash = hash('sha256', $string, true); 
$base64 = base64_encode($hash); 

當然,你應該怎麼做$unique我不知道。很可能你應該將這個值與請求一起發送,否則服務器無法驗證散列。

+0

是的,唯一和apikey是其他標題(它並沒有真正添加任何問題)。將第三個參數添加到散列函數使得這個工作成爲可能;非常感謝@deceze。 –

+0

當然,當你閱讀關於這個和我正在工作的相關編碼時,你的名字出現在官方文檔的評論中。 –

相關問題