hash,一般翻譯做「雜湊」,也有直接音譯為「雜湊」的,就是把任意長度的輸入(又叫做預對映),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。
通過對密碼進行雜湊處理,然後再儲存到資料庫中,這樣就使得攻擊者無法直接獲取原始密碼,同時還可以保證你的應用可以對原始密碼進行相同的雜湊處理,然後比對雜湊結果。
但是,密碼雜湊只能保護密碼不會被從資料庫中直接竊取,無法保證注入到應用中的惡意**攔截到原始密碼。
md5、sha1,、sha256這樣的雜湊演算法是面向快速、高效進行雜湊處理而設計的。現代化計算機可以快速的「反轉」上述雜湊演算法的雜湊值,不建議在密碼雜湊中使用這些演算法。
當進行密碼雜湊處理的時候,有兩個必須考慮的因素:計算量以及「鹽」。雜湊演算法的計算量越大,暴力破解所需的時間就越長。
php5.5提供乙個原生密碼雜湊api ,它提供一種安全的方式來完成密碼雜湊和驗證。password_hash()函式會隨機生成「鹽」。
php5.3及後續版本中,還可以使用crypt()函式,它支援多種雜湊演算法。php提供了對應的原生實現,所有在使用此函式的時候,你需要保證所選的雜湊演算法是你的系統所支援的。當對密碼進行雜湊處理的時候,建議採用blowfish演算法,相比md5或者sha1,這個演算法提供了更高的計算量,同時還有良好的伸縮性。
crypt(),採用blowfish演算法,如下:
if (crypt_blowfish == 1)
輸出:
blowfish: $2a$07$usesomesillystringfore2udlvp1ii2e./u9c8sbjqp8i90dh6hi
stringcrypt( string$str
[, string$salt
] )
blowfish 演算法使用如下鹽值:"$2a$",乙個兩位 cost 引數,"$" 以及 64 位由 "./0-9a-za-z" 中的字元組合而成的字串。在鹽值中使用此範圍之外的字元將導致 crypt() 返回乙個空字串。兩位 cost 引數是迴圈次數以 2 為底的對數,它的範圍是 04-31,超出這個範圍將導致 crypt() 失敗。 php 5.3.7 之前只支援 "$2a$" 作為鹽值的字首,php 5.3.7 開始引入了新的字首來修正乙個在blowfish實現上的安全風險。總而言之,開發者如果僅針對 php 5.3.7及之後版本進行開發,那應該使用 "$2y$" 而非 "$2a$"。
把密碼雜湊了,就安全了?
很多 儲存密碼的方式是把密碼進行雜湊化之後,然後儲存進資料庫。網上也一直再說雜湊化的密碼是無法破解的,確實按照雜湊的原理肯定無法破解的。因為雜湊本來就不是加密,只是把文字進行了特殊的處理。聽說雜湊之後,即使密碼被獲得了,使用者賬戶也不會被破解,這是真的嗎?難道對密碼進行雜湊就真的那麼安全嗎?最近在研...
PHP中雜湊密碼的安全性分析
php的基本雜湊函式已經不再安全?php手冊中有專門的乙個部分來介紹這個問題 很多應用,都是將使用者的密碼都是直接通過md5加密直接儲存到資料庫中的,包括我最近在用的開源專案zabbix的web管理介面。password 1234 hash md5 password echo res php常用的雜...
安全雜湊演算法
1.簡介 美國國家標準與技術學會和nsa開發了安全雜湊演算法 secure hash algorithm,sha sha可以處理長度在2 642 264以內的任何輸入訊息。sha的輸出是訊息摘要,長度為160位 比md5的訊息摘要多32位 sha中的安全利用了兩個特性,在計算上保證下列情況的不可行 ...