2012-05-25 155 views
2

我想更新我目前僅使用MD5的密碼設置。密碼salt存儲

現在我想要做的是使用更強的(也許sha256)與每個用戶獨特的鹽。

問題是關於鹽的儲存。

我是否將salt存儲在數據庫的自己的列中?

然後哈希salt +密碼,當涉及到登錄時,從數據庫中調用鹽和密碼,以製作一個。

或者我可以通過使用用戶名,電子郵件和時間戳來製作鹽,這也會給我一個獨特的鹽每個用戶?

我想知道,如果有人拿着鹽作爲列的數據庫,他們會知道每個用戶的鹽,然後他們可以破解密碼。

回答

0

只是閱讀另一篇文章,有人說鹽不是祕密,可以存儲數據庫列。所以這回答我的問題

5

鹽不是祕密,它可以存儲明文和散列一起。甚至沒有必要在數據庫中有第二個字段。如果您查看PHP的crypt()函數,您可以看到,salt將包含在散列值本身中。

這是鹽的工作,使現有的彩虹表無用,因爲必須爲特定的鹽建造彩虹表。對每個哈希使用不同的鹽將防止彩虹攻擊,因爲您必須爲每個哈希創建一個彩虹表。這就是爲什麼沒有必要保持鹽的祕密。

我會建議,如果你想改善你的密碼哈希系統,無論如何,你做對了,哈希函數是緩慢的。文章password hashes with bcrypt解釋了爲密碼生成散列的重要一點。

  • 根據密碼而不是每個用戶生成一個鹽。
  • 使用隨機(唯一)鹽,而不是從其他參數舀取的鹽。
  • 使用慢散列函數。

最後但並非最不重要的是,不要害怕正確地做,應用程序的代碼可以像您當前使用MD5一樣簡單。

+1

怎能鹽不是祕密呢?如果攻擊者知道鹽,他可以很容易地修改字典攻擊,包括鹽和瞧! –

+0

@Martins Briedis - 預先計算特定字典的所有哈希通常稱爲彩虹表。一個攻擊者不能使用已經存在的公共彩虹表(只是谷歌搜索的價值),因爲彩虹表必須針對一種特定的鹽(或者如果沒有使用鹽的情況下用於原始字典)。 – martinstoeckli

+0

@Martins Briedis - 忘了提及,建立一個彩虹表並不是你在幾秒鐘內完成的任務。當你使用慢哈希函數(比如bcrypt)時,它需要很多時間,如果你爲每個密碼使用不同的salt,那麼你需要很多時間來處理每個密碼。 – martinstoeckli

2

忘記MD5或SHA。使用Bcrypt。 (Blow Fish Crypt)來自PHP 5.3及以上版本。 (加密方法2a)它更安全並且處理更慢。

當使用Bcrypt時,salt與散列一起存儲在同一個表中。沒有理由分開。

http://php.net/manual/en/function.crypt.php

+0

那麼phpass - http://www.openwall.com/phpass/會做這項工作嗎? – Garry

+0

是PHPass會工作。如果使用上面的php 5.3,我建議只使用tho以上的本地php函數 – Ray