前言
我們常常為了避免在伺服器受到攻擊,資料庫被拖庫時,使用者的明文密碼不被洩露,一般會對密碼進行單向不可逆加密——雜湊。
常見的方式是:
雜湊方式
加密密碼
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 只對密碼加密,只要密碼相同,無論用什麼加密方式 對稱,非對稱,多種加密方式混用 加密後的內容都一樣。這種方式的問題在於太多的使用者用的密碼相同了,只要破解乙個密碼,一批使用者...