15

可能重複:
Secure hash and salt for PHP passwords最佳實踐

我在做的是有一個存儲用戶憑證(電子郵件,用戶名和密碼)的系統MySQL數據庫,並且在使用加密,醃製和加密類型時看到了相互衝突的觀點。

你會推薦什麼最好的方法?編碼在MD5或SHA1?醃製還是不醃製?只加密密碼或全部3個元素?

回答

11

對於密碼哈希使用PBKDF2這是NIST approved。對於每個密碼和非平凡(超過1000)迭代計數,您應該使用隨機非祕密鹽。

對於用戶名和電子郵件,可能不值得加密。

+1

+1對於PBKDF2好得多,儘管當性能不是問題時我通常使用10,000次迭代;) 舉例:http://csharptest.net/470/another -a-how-to-store-a-salted-password-hash/ –

+0

@ csharptest.net我同意你的迭代計數,很好的例子。 – jbtule

0

密碼應該用強鹽(MD5或SHA1很好)散列來保護,以防止使用彩虹表進行攻擊。

你不應該散列電子郵件地址 - 只要你散列它,除了檢查用戶輸入的內容之外,你無法將它用於其他任何事情,因此,如果散列會阻止你通過電子郵件發送該人。同樣,用戶名最好以純文本形式存儲,以便識別該用戶。

+1

請不要使用MD5或SHA1。它們都是密碼破解的。 –

2

它只是真正的密碼,你需要加密。實際上,你應該在至少 SHA-256真的(我敢肯定MD5和SHA1是可破解的)算法Hashing(這就是你說的編碼時的意思)Salting你的密碼是額外的安全。

這裏是上存儲他們的首選方法的答案:Preferred Method of Storing Passwords In Database

1

用戶名和電子郵件不應該被加密,你需要他們的明文,他們會更加有用的方式。

至於密碼:他們應該絕對加密或散列,最好用鹽。到目前爲止,我使用了一種有趣的技術來做到這一點:AES,密鑰本身就是密鑰。因此,如果用戶將他的密碼設置爲「blabla123」,那麼我將通過調用AES_ENCRYPT('blabla123', 'blabla123')將其存儲在MySQL中。有2個優勢是:

  • 你不存儲加密密鑰的任何地方
  • 每個密碼使用不同的密鑰進行加密。所以,即使你確定了一把鑰匙,它的用處也會受到限制。

然後通過加密用戶鍵入的內容和比較2個值來完成有效性。

+0

我喜歡這個... –

+0

我也喜歡這種方法!如果你採用這種方法,是否值得醃製? –

+1

@PhilFaceplantYoung,我想你會想吃這個。這是開放的彩虹襲擊沒有鹽。 –

6

最佳實踐IMO是:

  • 使用哈希算法如SHA256或SHA512。 MD5現在不安全,因爲您可以反轉散列/執行彩虹攻擊。

  • 使用強鹽來確保攻擊者無法猜測常見的散列密碼,如果他們獲得了進入數據庫的權限。

  • 請勿使用加密。

  • 只有散列的密碼,用戶名和電子郵件都是純文本。

+0

+1哈希電子郵件和用戶名將是艱難的,因爲他們通常不是案件敏感。 –

+1

這不是正確的答案。您想要使用適當的密碼散列函數,例如PBKDF2或bcrypt。 – imichaelmiers

+0

@imichaelmiers - 這並不意味着我的回答不正確。您推薦使用更強大的散列函數,但SHA256和512仍然有效,因爲沒有發現散列衝突。 –