我們需要存儲密碼(存儲的真實信息是一些非常具體的商業信息,但可以與密碼進行比較以簡化問題)。密碼應該被散列/加密。如何存儲這些敏感信息?
我們不希望能夠讀取密碼,但要能夠知道哪些用戶具有相同的。
如果我們crypt()
與CRYPT_BLOWFISH
哈希使用總是相同的鹽?
我們如何散列/加密密碼並確保數據庫受到攻擊時,攻擊者將無法讀取或解密它們?
我們需要存儲密碼(存儲的真實信息是一些非常具體的商業信息,但可以與密碼進行比較以簡化問題)。密碼應該被散列/加密。如何存儲這些敏感信息?
我們不希望能夠讀取密碼,但要能夠知道哪些用戶具有相同的。
如果我們crypt()
與CRYPT_BLOWFISH
哈希使用總是相同的鹽?
我們如何散列/加密密碼並確保數據庫受到攻擊時,攻擊者將無法讀取或解密它們?
這完全取決於您的商業信息。你已經看到,哈希會比加密更好,因爲它不能被解密(否則你會有不同的要求)。
爲什麼你不能像密碼一樣散列信息的問題是,salt將是唯一的,因此散列函數會導致無法比較的散列值。如果我們可以不用鹽,我們可以使用哈希函數來達到您的目的。
醃製完成,因爲密碼通常是短textes(人們必須記住它們)。通過檢查字典或彩虹表,我們可以非常快速地找到原始密碼,但沒有鹽+密碼textes的現有彩虹表。換句話說,具有一定長度的非常強大的密碼不需要鹽分以保證安全。如果您的商業信息具有足夠的獨特信息(熵),則可以在不使用鹽的情況下進行哈希處理,並使用BCrypt或PBKDF2。
您需要一個salt和bytes數組來存儲敏感信息。然後,您可以安全地使用存儲在其他位置的主密鑰對該對進行加密。通過2階段加密,您可以根據安全需要隨時滾動您的密鑰。您的應用程序需要能夠組合這些部分來比較數據。
使用密碼你總是在尋找散列,你不想或不需要解密它們。因此,你在尋找的是一個強大的哈希算法,河豚或SHA512我會建議。至於你對不同用戶密碼比較的問題,那麼這會大大降低系統的整體安全性。
您想要隨機添加一個密碼,以便無法預先計算哈希值,因此即使相同的密碼對每個用戶都有不同的哈希值,否則攻擊者可能會發現哪些用戶使用相同的密碼密碼並將其用於自己的優勢。對每個密碼使用相同的鹽都會使其失去目的,而使用none則允許使用彩虹表,所以如果您想要安全地設計應用程序,則必須犧牲該特定功能。
編輯:對不起刪除評論和張貼作爲答案
我想,如果你正在尋找一個妥協,你會尋求在很多散列迭代,也許通用於所有的密碼一個大的隨機鹽。這應該確保沒有任何可用的預先計算的表用於破解密碼並增加破解時間。算法鏈接也可能是一個選項,但如果有很多用戶,則可能會遇到性能問題。本質上,如果你仍然希望能夠比較用戶密碼,那麼計算哈希值會花費很多時間,這會大大增加開發時間。再次強調,這將是一個妥協,絕對不是解決此問題的最有效和最安全的方式。
使用密碼我和許多其他網站上的SO和其他網站強烈建議Bcrypt; Bcrypt是一種計算密集型哈希算法,其設計對於暴力來說是緩慢且昂貴的。
你可以閱讀更多關於Bcrypt在這裏回答: How do you use bcrypt for hashing passwords in PHP?
至於比較值,你不能用Bcrypt,但你可以檢查值是否正確。
如果一個網站正在檢查我是否與另一個用戶擁有相同的密碼,我會非常擔心。 – 2013-10-05 03:35:45
@Dagon:再讀第一句。 – Toto
我已經讀了三次,我還不確定它的密碼是否。 – 2013-10-05 03:46:31