我想更新我目前僅使用MD5的密碼設置。密碼salt存儲
現在我想要做的是使用更強的(也許sha256)與每個用戶獨特的鹽。
問題是關於鹽的儲存。
我是否將salt存儲在數據庫的自己的列中?
然後哈希salt +密碼,當涉及到登錄時,從數據庫中調用鹽和密碼,以製作一個。
或者我可以通過使用用戶名,電子郵件和時間戳來製作鹽,這也會給我一個獨特的鹽每個用戶?
我想知道,如果有人拿着鹽作爲列的數據庫,他們會知道每個用戶的鹽,然後他們可以破解密碼。
我想更新我目前僅使用MD5的密碼設置。密碼salt存儲
現在我想要做的是使用更強的(也許sha256)與每個用戶獨特的鹽。
問題是關於鹽的儲存。
我是否將salt存儲在數據庫的自己的列中?
然後哈希salt +密碼,當涉及到登錄時,從數據庫中調用鹽和密碼,以製作一個。
或者我可以通過使用用戶名,電子郵件和時間戳來製作鹽,這也會給我一個獨特的鹽每個用戶?
我想知道,如果有人拿着鹽作爲列的數據庫,他們會知道每個用戶的鹽,然後他們可以破解密碼。
只是閱讀另一篇文章,有人說鹽不是祕密,可以存儲數據庫列。所以這回答我的問題
鹽不是祕密,它可以存儲明文和散列一起。甚至沒有必要在數據庫中有第二個字段。如果您查看PHP的crypt()
函數,您可以看到,salt將包含在散列值本身中。
這是鹽的工作,使現有的彩虹表無用,因爲必須爲特定的鹽建造彩虹表。對每個哈希使用不同的鹽將防止彩虹攻擊,因爲您必須爲每個哈希創建一個彩虹表。這就是爲什麼沒有必要保持鹽的祕密。
我會建議,如果你想改善你的密碼哈希系統,無論如何,你做對了,哈希函數是緩慢的。文章password hashes with bcrypt解釋了爲密碼生成散列的重要一點。
最後但並非最不重要的是,不要害怕正確地做,應用程序的代碼可以像您當前使用MD5一樣簡單。
忘記MD5或SHA。使用Bcrypt。 (Blow Fish Crypt)來自PHP 5.3及以上版本。 (加密方法2a)它更安全並且處理更慢。
當使用Bcrypt時,salt與散列一起存儲在同一個表中。沒有理由分開。
怎能鹽不是祕密呢?如果攻擊者知道鹽,他可以很容易地修改字典攻擊,包括鹽和瞧! –
@Martins Briedis - 預先計算特定字典的所有哈希通常稱爲彩虹表。一個攻擊者不能使用已經存在的公共彩虹表(只是谷歌搜索的價值),因爲彩虹表必須針對一種特定的鹽(或者如果沒有使用鹽的情況下用於原始字典)。 – martinstoeckli
@Martins Briedis - 忘了提及,建立一個彩虹表並不是你在幾秒鐘內完成的任務。當你使用慢哈希函數(比如bcrypt)時,它需要很多時間,如果你爲每個密碼使用不同的salt,那麼你需要很多時間來處理每個密碼。 – martinstoeckli