PHP和Python實戰bcrypt演算法
本文是 bcrypt() 演算法介紹的第二篇,第一篇參考《安全儲存口令的業界標準:bcrypt演算法》,本文主要介紹PHP和Python語言中如何更好使用 bcrypt 演算法保護口令安全。
在一個系統中,可能有多種語言需要校驗同一個口令密文,PHP和Python在操作上也是互通的。
在 PHP 語言中,已經不建議使用 bcrypt() 演算法,推薦使用Password Hashing Functions 。
這個庫最重要的一個函式是 password_hash,原型:
string password_hash($password, int$algo[,array $options])
$algo 表示使用那種 Hash 演算法,預設是 PASSWORD_DEFAULT,表示 bcrypt 演算法。
$options 可以有兩個屬性,cost 表示迭代因子次數,$salt 表示可以顯示輸入 salt,但從 php7 版本開始廢棄 $salt 引數,也就是由函式生成不可猜測的 salt。
看看如何使用:
// PHP 5.5 以上版本 function better_crypt($input, $rounds = 7) { $options = [ 'cost' => $rounds, ]; return password_hash($input, PASSWORD_BCRYPT, $options); } $hash = better_crypt("woshi123pas");
接下去重點 看下口令密文的輸出 $2y$07$xiJjq8T8RMl.4eIlQs3UhOGrm/WoO7.GcuQIZfOHCFdm0nVRP3WjC。
其中 $2y 表示採用 bcrypt() 演算法,10 表示迭代因子,xiJjq8T8RMl.4eIlQs3UhOG 表示 salt,剩餘部分才是口令密文。
等等,在《如何安全儲存口令?瞭解下Hash加鹽的原理》這篇文章中說過,salt 和口令密文應該分開儲存,但很多文章在介紹 crpyt 演算法的時候,都沒有建議 salt 和 口令密文分開儲存,從安全的角度,請務必將迭代因子、salt、口令密文分開儲存 。
如果想校驗口令密文,那麼可以使用 password_verify() 函式校驗,貼程式碼:
// hash 是儲存在資料庫中的口令密文 function verify_crypt($input, $hash, $rounds = 7) { if (password_verify($input, $hash)) return TRUE; return false ; } $hash = better_crypt("woshi123pas"); var_dump(verify_crypt("woshi123pas",$hash));
還可以更新口令密文,呼叫 password_needs_rehash() 即可,定期更新 salt,可以更安全保護口令。
最後介紹下 Python 中的 bcrypt 包,如果沒有安裝,使用 pip3 install bcrypt 安裝。
貼程式碼:
import bcrypt def bcryptfun(password): salt = bcrypt.gensalt(rounds=12) print(salt) hashed_passwd = bcrypt.hashpw(password, salt) return (hashed_passwd) password = 'wo@yigepass' password = bytes(password,'utf-8') #加密口令 mw=bcryptfun(password) print (mw) #校驗 mwjy = bcrypt.hashpw(password, mw) == mw print(mwjy)
Python 和 PHP 校驗口令密文是互通的,大家可以測試下。
關注我的wx g z h(ID:yudadanwx,虞大膽的嘰嘰喳喳)。