2015-10-29 112 views
2

我正在嘗試使用私鑰&公鑰實現API的身份驗證。針對PHP的基於令牌的身份驗證

我想要做的就是提供一個私鑰,用它散列一些數據,並在頭部發送哈希,然後再次在服務器上重新哈希相同的數據進行比較。

我遇到的麻煩是什麼樣的數據,我應該散列,請求的URI,內容類型和內容本身,但什麼時候請求是GET和沒有內容。

使用私鑰散列任何數據足夠安全,還是需要做一些特殊的事情?

+4

當你* *哈希,你並不需要/想一個公私密鑰對,因爲在再現散列是沒有用的。公私密鑰對與非對稱密碼算法一起使用,這在這裏並不真正使用。所以,沒有P/P鍵;你真的只想要一個*共享密碼*,一個令牌。 – deceze

+0

只發送該令牌進行身份驗證? –

+0

如果你需要一個私鑰/公鑰對,你不想要一個哈希,你想要一個數字簽名。例如,['openssl_sign()'](https://secure.php.net/manual/en/function.openssl-sign.php)。 –

回答

2
  1. 如評論中所述,您不需要公鑰/私鑰對。你想要的是一個身份證明。客戶會給你他們的用戶名/ ID(他們會要求一個身份證明),你需要額外的證據證明他們是真的。爲此目的,他們發送一個祕密的,這隻有他們應該知道的祕密。這是一個簡單的標誌。

  2. 您希望避免通過電線來回發送此令牌。請記住這是一個祕密,應儘可能保密。相反,你要求客戶發送的是間接證據;你問他們標牌的要求。

  3. 簽名請求意味着它們只是hash the contents of the request with a MAC algorithm,它們的祕密令牌是散列的關鍵。

    • 什麼部分的請求散列你決定;包含在散列表中的所有內容都是第三方不可形成的,但是您應該避免要求所有都被散列,因爲可能會在請求的各個階段添加或刪除HTTP標頭。
    • 爲避免重播攻擊,請散列請求日期(並要求將日期與請求一起發送)。不要接受超過特定失效日期的請求。或者包括一個不斷變化的令牌,如果可行的話。
    • 確保散列很容易重現,例如要求對要散列的數據進行排序。
    • 您應該在散列中包含URL;如果你這樣做,是否有身體數據並不重要。從上面的URL +日期/標記已經足夠形成一個MAC。
相關問題