我在做的是有一個存儲用戶憑證(電子郵件,用戶名和密碼)的系統MySQL數據庫,並且在使用加密,醃製和加密類型時看到了相互衝突的觀點。
你會推薦什麼最好的方法?編碼在MD5或SHA1?醃製還是不醃製?只加密密碼或全部3個元素?
我在做的是有一個存儲用戶憑證(電子郵件,用戶名和密碼)的系統MySQL數據庫,並且在使用加密,醃製和加密類型時看到了相互衝突的觀點。
你會推薦什麼最好的方法?編碼在MD5或SHA1?醃製還是不醃製?只加密密碼或全部3個元素?
對於密碼哈希使用PBKDF2這是NIST approved。對於每個密碼和非平凡(超過1000)迭代計數,您應該使用隨機非祕密鹽。
對於用戶名和電子郵件,可能不值得加密。
密碼應該用強鹽(MD5或SHA1很好)散列來保護,以防止使用彩虹表進行攻擊。
你不應該散列電子郵件地址 - 只要你散列它,除了檢查用戶輸入的內容之外,你無法將它用於其他任何事情,因此,如果散列會阻止你通過電子郵件發送該人。同樣,用戶名最好以純文本形式存儲,以便識別該用戶。
請不要使用MD5或SHA1。它們都是密碼破解的。 –
它只是真正的密碼,你需要加密。實際上,你應該在至少 SHA-256真的(我敢肯定MD5和SHA1是可破解的)算法Hashing
(這就是你說的編碼時的意思)和Salting
你的密碼是額外的安全。
這裏是上存儲他們的首選方法的答案:Preferred Method of Storing Passwords In Database
用戶名和電子郵件不應該被加密,你需要他們的明文,他們會更加有用的方式。
至於密碼:他們應該絕對加密或散列,最好用鹽。到目前爲止,我使用了一種有趣的技術來做到這一點:AES,密鑰本身就是密鑰。因此,如果用戶將他的密碼設置爲「blabla123」,那麼我將通過調用AES_ENCRYPT('blabla123', 'blabla123')
將其存儲在MySQL中。有2個優勢是:
然後通過加密用戶鍵入的內容和比較2個值來完成有效性。
我喜歡這個... –
我也喜歡這種方法!如果你採用這種方法,是否值得醃製? –
@PhilFaceplantYoung,我想你會想吃這個。這是開放的彩虹襲擊沒有鹽。 –
最佳實踐IMO是:
使用哈希算法如SHA256或SHA512。 MD5現在不安全,因爲您可以反轉散列/執行彩虹攻擊。
使用強鹽來確保攻擊者無法猜測常見的散列密碼,如果他們獲得了進入數據庫的權限。
請勿使用加密。
只有散列的密碼,用戶名和電子郵件都是純文本。
+1哈希電子郵件和用戶名將是艱難的,因爲他們通常不是案件敏感。 –
這不是正確的答案。您想要使用適當的密碼散列函數,例如PBKDF2或bcrypt。 – imichaelmiers
@imichaelmiers - 這並不意味着我的回答不正確。您推薦使用更強大的散列函數,但SHA256和512仍然有效,因爲沒有發現散列衝突。 –
+1對於PBKDF2好得多,儘管當性能不是問題時我通常使用10,000次迭代;) 舉例:http://csharptest.net/470/another -a-how-to-store-a-salted-password-hash/ –
@ csharptest.net我同意你的迭代計數,很好的例子。 – jbtule