2012-04-14 42 views
0

我是網絡開發和數據庫的新手,並試圖以合理的安全性和速度實施密碼身份驗證。我已閱讀了有關哈希密碼並追加了每個用戶獨有的鹽,以阻止人們生成彩虹表。搜索數據庫所花費的時間

我的問題涉及我必須搜索以驗證用戶的時間。由於我不知道誰在任何時候嘗試連接,因此在我看來,我需要從salt列中檢索每個字段,然後對提交的密碼和每個獨特的鹽進行散列,然後最後將每個輸出與散列進行比較表中的字符串?

所以我必須提交散列(密碼+鹽)的每個組合的單獨查詢?這看起來會非常緩慢。我錯過了一個可以加速這個過程的技巧嗎?還是僅僅是爲了提高安全性而犧牲速度?或者我誤以爲今天的電腦速度並不是問題?

回答

1

您不能僅基於密碼對用戶進行身份驗證。密碼是驗證用戶是誰,他們說他們是誰,所以你需要某種用戶標識符 - 名稱或其他。表然後看起來像users(..., name, password, ...),你做SELECT password WHERE name = "foo"並從那裏繼續驗證。便利的形式是保持在密碼字段內生成派生密鑰所需的所有參數,例如,像這樣:

algo$salt$password hash 

對於散列本身,你不希望它是快 - 看到像PBKDF2,bcrypt或scrypt密鑰導出函數。一般來說,調整這些參數以便獲取一個關鍵字需要一秒左右的時間,這是使暴力強制成爲不可行的一個好方法。

+0

哇我是個白癡。我不敢相信我沒有想過要在名稱列中搜索匹配的字符串,而不是將該用戶的密碼與鹽進行比較。在我的辯護中,現在是凌晨3點半,我現在在哪裏哈哈。謝謝。 – StackAttack 2012-04-14 07:24:33

相關問題