程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 密碼散列安全,密碼散

密碼散列安全,密碼散

編輯:關於PHP編程

密碼散列安全,密碼散


  hash,一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入(又叫做預映射),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。

  通過對密碼進行散列處理,然後再保存到數據庫中,這樣就使得攻擊者無法直接獲取原始密碼,同時還可以保證你的應用可以對原始密碼進行相同的散列處理,然後比對散列結果。

  但是,密碼散列只能保護密碼不會被從數據庫中直接竊取,無法保證注入到應用中的惡意代碼攔截到原始密碼。

  MD5、sha1,、sha256這樣的散列算法是面向快速、高效進行散列處理而設計的。現代化計算機可以快速的“反轉”上述散列算法的散列值,不建議在密碼散列中使用這些算法。

  當進行密碼散列處理的時候,有兩個必須考慮的因素:計算量以及“鹽”。散列算法的計算量越大,暴力破解所需的時間就越長。

  php5.5提供一個原生密碼散列API ,它提供一種安全的方式來完成密碼散列和驗證。password_hash()函數會隨機生成“鹽”。

  php5.3及後續版本中,還可以使用crypt()函數,它支持多種散列算法。php提供了對應的原生實現,所有在使用此函數的時候,你需要保證所選的散列算法是你的系統所支持的。當對密碼進行散列處理的時候,建議采用Blowfish算法,相比MD5或者sha1,這個算法提供了更高的計算量,同時還有良好的伸縮性。 

crypt(),采用Blowfish算法,如下:

if (CRYPT_BLOWFISH == 1) {
    echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}

輸出:

Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

string crypt ( 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$"。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved