2015-06-17 99 views
3

我想擺脫使用md5()存儲和比較密碼。所以我想開始使用password_hash()。此用戶身份驗證是否足夠安全?

現在,我是如何做到這一點的,我會將用戶名和密碼的md5存儲在他們的會話或cookie中(如果他們選擇「記住我」),然後檢查數據庫以查看是否有用戶以該用戶名和md5的密碼存在。我意識到這不是很安全,這就是爲什麼我想停止這一點。

我不能再這樣做了,因爲password_hash()總是在變化,所以我不能在他們的會話中存儲一個散列,然後在數據庫中檢查它,因爲我需要在unhashed密碼上使用password_verify。

所以我的問題是,如果我在用戶成功登錄時在用戶表中存儲散列「會話ID」和「令牌」,然後將它們與用戶ID一起按順序存儲在會話/ Cookie中用來檢查數據庫,這是否足夠安全?當我說哈希「會話ID」和「令牌」我的意思是sha256'd或隨機大數連md5'd哈希...

實例:

用戶登錄 - >散列「會話ID」和「令牌」存儲在用戶cookies/session中,並且它們在數據庫中的行用散列的「會話ID」和「令牌」更新。

用戶訪問網站 - >代碼檢查,根據他們的瀏覽器會話/ cookie變量來查看他們的「會話ID」和「令牌」是否存在於數據庫中。如果是這樣,它假定找到的行表示當前用戶。

任何有識之士將不勝感激。

+0

您可以使用Salted Password Hashing。 –

+2

@PraveenD - password_hash()已經產生了一個鹽漬哈希....你究竟在暗示什麼? –

+0

鹽應該是隨機的每個散列。 –

回答

0

爲了獲得最佳的密碼散列值和使用情況而簡單到代碼是例如低於...

$salts= ['cost' => 12]; password_hash("Password", PASSWORD_BCRYPT, $options);

$salts是當使用password_hash()它結合miltiple倍的陣列。

PASSWORD_BCRYPT是用「$ 2y $」標識符和blowfish加密算法散列字符串的算法。這會輸出60個混亂的字符集。

+0

您可以添加在'$ salts' –

+1

請不要做任何'數字鍵⇒Values的[ '鹽'=> 12]',你想'[ '成本'=> 12]'。 –

+0

對@Scott Arciszewski,我後來意識到了。使用'['cost'=> 12]' –

1

我會做的是當用戶登錄時,使用uinqid()(http://php.net/uniqid)爲其登錄名生成唯一的ID,然後將其存儲在新表中。然後檢查此表以查看cookie是否與存儲在表中的uniqid匹配。

當用戶再次登錄時,您必須確保表格行已被刪除,但如果用戶在多個設備上設置記住我,則會導致問題,因此我會設置過期日期表中的每個ID,登錄腳本將:

  1. SELECT * FROM 'UNIQIDS' WHERE $ current_date_and_time> '屆滿',並刪除所有結果
  2. 檢查一個cookie的存在。如果有一個和它的uniqid匹配,在計算機上創建一個會話,否則顯示登錄頁面

一旦用戶登錄:

  1. 檢查,如果已經有存儲在表中的uniqid
  2. 如果有一個存儲,如果當前日期和時間是過去的到期日期,刪除該行
  3. 如果一個已過期生成一個新的一個新的到期日匹配您正在生成cookie的到期日。如果沒有過期,請計算從現在到過期的時間,並創建一個包含其值的cookie,並在您計算的時間內過期。

這是非常安全的,因爲它很難僞造這個cookie,並且它不會將用戶密碼信息傳遞給客戶端機器。

爲了更安全,你可以MD5你生成uniqid,但世界上沒有真正的需要,因爲它不包含重要信息。

這是相當複雜的,但如果你把它一步步來的時候,它不應該是不可能的。

祝你好運!

+0

在存儲到數據庫中之前,令牌應該被散列化,否則攻擊者可以讀取數據庫(SQL注入),讀取令牌並模擬用戶。因爲令牌(20多個隨機字符)是一個非常強大的「密碼」,所以可以使用像SHA-256這樣的快速無損散列,這使得它們具有可比性。 – martinstoeckli

+0

不一定。如果您從表中選擇所有行,而不是讓最終用戶訪問SQL語句,創建一個關聯並使用for/loop讓php搜索assoc,而不是讓mysql在返回assoc之前搜索表,它會離開該表無懈可擊的SQL注入。在那之後,如果你的SQL被黑客入侵,你就會遇到比哈希安全更大的問題。 – zachal

+0

它不一定是帶有標記的表,它可以揭示散列,每個SQL語句都必須得到保護。看看我的[教程]中的示例(http://www.martinstoeckli.ch/hash/en/hash_sqlinjection.php)。如果你使用第三方庫,你也必須測試這些代碼。即使如此,還有其他方式令牌可能會丟失,丟棄的服務器,備份,... – martinstoeckli

相關問題