PHP更安全的密碼加密機制Bcrypt詳解

2022-09-27 03:21:14 字數 2611 閱讀 8993

前言

我們常常為了避免在伺服器受到攻擊,資料庫被拖庫時,使用者的明文密碼不被洩露,一般會對密碼進行單向不可逆加密——雜湊。

常見的方式是:

雜湊方式

加密密碼

md5(『123456')

e10adc3949ba59abbe56e057f20f883e

md5(『123456' . ($salt = 『salt'))

207acd61a3c1bd506d7e9a4535359f8a

sha1(『123456')

40位密文

hash(『sha256', 『123456')

64位密文

hash(『sha512', 『123456')

128位密文

密文越長,在相同機器上,進行撞庫消耗的時間越長,相對越安全。

比較常見的雜湊方式是 md5 + 鹽,避免使用者設定簡單密碼,被輕鬆破解。

password_hash

但是,現程式設計客棧在要推薦的是password_hash()函式,可以輕鬆對密碼實現加鹽加密,而且幾乎不能破解。

$password = '123456';

var_dump(password_hash($password, password_default));

var_dump(password_hash($password, password_default));

password_ha程式設計客棧sh生成的雜湊長度是 password_bcrypt —— 60位,password_default —— 60位 ~ 255位。password_default 取值跟 php 版本有關係,會等於其他值,但不影響使用。

每一次password_hash執行結果都不一樣,因此需要使用password_verify函式進行驗證。

$password = '123456';

$hash = password_hash($password, password_default);

var_dump(password_verify($password, $haswww.cppcns.comhwww.cppcns.com));

password_hash會把計算 hash 的所有引數都儲存在 hash 結果中,可以使用password_get_info獲取相關資訊。

$password = '123456';

$hash = password_hash($password, password_default);

var_dump(password_get_info($hash));

輸出array(3)

}注意:不包含 salt

可以看出我當前版本的 php 使用password_default實際是使用password_bcrypt。

password_hash($password, $algo, $options)的第三個引數$options支援設定至少 22 位的 salt。但仍然強烈推薦使用 php 預設生成的 salt,不要主動設定 salt。

當要更新加密演算法和加密選項時,可以通過password_needs_rehash判斷是否需要重新加密,下面的**是一段官方示例

$options = array('cost' => 11);

// verify stored hash against plain-text password

if (password_verify($password, $hash))

// log user in

}password_needs_rehash可以理解為比較$algo+$option和password_get_info($hash)返回值。

password_h程式設計客棧ash 運算慢

password_hash是出了名的執行慢,也就意味著在相同時間內,密碼重試次數少,洩露風險降低。

$password = '123456';

var_dump(microtime(true));

var_dump(password_hash($password, password_default));

var_dump(microtime(true));

echo "\n";

var_dump(microtime(true));

var_dump(md5($password));

for ($i = 0; $i < 999; $i++)

var_dump(microtime(true));

輸出float(1495594920.7034)

string(60) "$2y$10$9zlvgzqmizpekyiiucht6eujqebekoajfqo8/jw/q6dmrmwnn0pdm"

float(1495594920.7818)

float(1495594920.7818)

string(32) "e10adc3949ba59abbe56e057f20f883e"

float(1495594920.7823)

password_hash執行一次耗時 784 毫秒, md5 執行 1000 次耗時 5 毫秒。這是乙個非常粗略的比較,跟執行機器有關,但也可以看出password_hash執行確實非常慢。

總結本文標題: php更安全的密碼加密機制bcrypt詳解

本文位址:

php加密登入 PHP安全登入 密碼加密

以下是要實施安全登入的登入系統 main login.php username password checklogin.php ob start host localhost host name username root mysql username password mysql password...

PHP比md5更安全的加密方式 雜湊密碼

傳統加密方式 md5 密碼 鹽值 12 3 4 5 passwordstring your password 你的密碼 salt your salt value 鹽值,增加複雜度 隨機字串 md5password md5 passwordstring.salt 從理論上來說,md5不可逆,算是一種比...

密碼安全與加密 提公升千百倍的密碼安全

最近幾年太多密碼洩露問題了。出問題原因有幾個 1 明文儲存密碼。這個以csdn為首,居然超過10年都這樣,偶實在無話可說。2 只對密碼加密,只要密碼相同,無論用什麼加密方式 對稱,非對稱,多種加密方式混用 加密後的內容都一樣。這種方式的問題在於太多的使用者用的密碼相同了,只要破解乙個密碼,一批使用者...