2014-01-17 173 views
2

我有一個網站,用戶可以在網站上選擇「記住我」(AKA設置cookie)並根據本網站的建議,我將數據庫中的密碼加密轉換爲php的password_hash()函數。現在,我不能只比較任何舊的散列,因此我使用php的password_verify()。密碼驗證需要明文和密碼哈希。Cookie加密/解密

如何將用戶的密碼存儲在瀏覽器cookie中而不是明文?

回答

3

將密碼存儲在cookie本身是一個非常糟糕的主意,不要這樣做。

在一個很高的水平,我想:

  1. 生成令牌(喜歡的東西md5),它由一個獨特的夫婦(但一致的)的屬性此用戶
  2. 同時存儲用戶ID並將此令牌放在Cookie中(由一些已知的分隔符分隔)
  3. 當用戶訪問您的站點時,可以拆分ID和令牌
  4. 使用ID從數據庫中獲取用戶記錄,創建一個新的來自數據庫記錄的令牌,並進行比較與cookie令牌

所以我們來簡單介紹一下。假設$hash是存儲在數據庫中的密碼哈希,並且此用戶還有一個$userId$username變量。

我會生成一個cookie,看起來是這樣的:

$token = md5($userId . $username . $hash); 
$cookie = $userID . "|" . $token; // 1|XXXXXXXX 

現在,當用戶訪問您的網站,檢索這個cookie:

$parts = explode("|",$cookie); 
$userId = $parts[0]; 
$token = $parts[1]; 

現在你知道用戶是誰聲稱是,但你需要驗證。

從數據庫中提取用戶記錄,然後重新生成令牌並進行比較。

// Assuming you just ran a SELECT query, and fetched the result into `$row` 
$dbToken = md5($row['userId'] . $row['username'] . $row['hash']); 
if($token == $dbToken) { 
    // The user is who he claims to be! Log them in 
} else { 
    // The cookie token didn't match our re-generated token, don't trust this cookie 
} 

有意義嗎?您可能需要針對您的情況稍微修改一下。希望這可以幫助你至少朝好的方向前進。

+0

我有這麼長的回答說同樣的事情,然後你說得更好。 +1很好的答案。 –

+0

我認爲這工作(因爲它在設置cookie),我唯一的問題是,我驗證cookie的方式並不真正起作用。 [代碼](http://pastebin.com/2nGTDnF8)(請參見突出顯示的行) – mrkirby153

+0

@ mrkirby153很高興看到該方法似乎適用於您的情況。至於專門調試你的類,開始做'print_r($ _ COOKIE)'看看你實際上有什麼。也許cookie數組並不完全符合你的期望?也許'verifyDatabase'沒有被調用?我認爲您可以根據代碼的工作方式進行一些常規的PHP調試,這與cookie標記特有的工作方式無關。 – jszobody