我創建一個基於PHP的CMS(使用MVC體系結構)。我想散列存儲在數據庫中的用戶密碼。我已經閱讀了許多有關這個主題的藝術品和教程,但我面臨着反對的意見/觀點和建議。我有點困惑。我正在尋找實現密碼散列的最佳方式。這些是我遇到的概念/方法:密碼哈希方法
首先,很多人混淆了單向哈希和雙向加密。如果我沒有弄錯,雙向加密是關於公私密鑰對的不對稱加密的問題,而且它是爲了保護數據並使其只能由知道其他密鑰(祕密密鑰)的人讀取。所以這就是我們現在不在乎的東西。
PHP提供了許多功能,以使散列,它們中的一些直接使用在給定的數據(md5()
,sha1()
,sha256()
,ripemd160()
等)它們中的一些接受給定的數據和所支持的算法散列alogrithm和生成的哈希(hash()
,hash_init()
,hash_hmac()
等) 哈希/加密方法的負載有什麼區別? (hash_pbkdf2()
,crypt()
,bcrpyt
,password_hash()
和其他以上提到的) 據我所知,在散列中使用鹽是一個好習慣,但多次散列是一個壞主意(即使如此多的散列也是好的)。有些功能的使用鹽別人用鑰匙...
問題1: 可能有人澄清什麼是如md5('myPassword');
和hash('md5', 'myPassword');
(我知道MD5是一個容易破解的方法,不建議使用之間的:差異儲存口令)
問題2: ,是什麼關鍵和鹽之間的區別?那麼hash_hmac('sha1', 'myPassword', 'HaCK_MeIF_youCAN');
和sha1('myPassword'.'HaCK_MeIF_youCAN');
之間有什麼區別? (注意hash_hamc調用它的第三個參數「鑰匙」)
問題3: 是多個散列真的是不好的做法? 像:
hash = sha512(password)
for i in range(10000):
hash = sha512(hash) + salt
return hash
問題4: 應該用什麼來散列我的密碼的最佳方法是什麼?
由於這是一個重要和敏感的問題,我認爲其他人不熟悉像我這樣的話題想要使這個哈希事情清楚,希望一勞永逸得到準確和可靠的答案,我請你回答以防萬一您是IT安全專家,或者您擁有此主題的任何認證或學位! (對於誰收購了互聯網上的知識自稱安全專家:事實上你已經做了數百個散列密碼系統/網站,並不意味着他們是安全的!)
而最後一個請求:簡單(初學者)web程序員不是外星人,也不是理論數學家。所以請嘗試在一些像人一樣的英語中解釋:)
您是否閱讀過[基於網站認證的權威指南](http://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication)? –
問題4:使用'password_hash'或其兼容性庫。這是一個易於使用bcrypt封裝。 – CodesInChaos
另請參閱Openwall的[便攜式PHP密碼哈希框架](http://www.openwall.com/phpass/)(PHPass)。它強化了對用戶密碼的一些常見攻擊。 – jww