PHP和Python實(shí)戰(zhàn)bcrypt算法

本文是 bcrypt() 算法介紹的第二篇,第一篇參考《安全存儲口令的業(yè)界標(biāo)準(zhǔn):bcrypt算法》,本文主要介紹PHP和Python語言中如何更好使用 bcrypt 算法保護(hù)口令安全。

在一個系統(tǒng)中,可能有多種語言需要校驗同一個口令密文,PHP和Python在操作上也是互通的。

在 PHP 語言中,已經(jīng)不建議使用 bcrypt() 算法,推薦使用Password Hashing Functions。

這個庫最重要的一個函數(shù)是 password_hash,原型:

string password_hash($password , int $algo [, array $options ])

$algo 表示使用那種 Hash 算法,默認(rèn)是 PASSWORD_DEFAULT,表示 bcrypt 算法。

options 可以有兩個屬性,cost 表示迭代因子次數(shù),salt 表示可以顯示輸入 salt,但從 php7 版本開始廢棄 $salt 參數(shù),也就是由函數(shù)生成不可猜測的 salt。

看看如何使用:

// PHP 5.5 以上版本
function better_crypt($input, $rounds = 7) {
    $options = [
        'cost' => $rounds,
    ];
    return password_hash($input, PASSWORD_BCRYPT, $options);
}

$hash = better_crypt("woshi123pas");

接下去重點(diǎn)看下口令密文的輸出 2y07$xiJjq8T8RMl.4eIlQs3UhOGrm/WoO7.GcuQIZfOHCFdm0nVRP3WjC。

其中 $2y 表示采用 bcrypt() 算法,10 表示迭代因子,xiJjq8T8RMl.4eIlQs3UhOG 表示 salt,剩余部分才是口令密文。

等等,在《如何安全存儲口令?了解下Hash加鹽的原理》這篇文章中說過,salt 和口令密文應(yīng)該分開存儲,但很多文章在介紹 crpyt 算法的時候,都沒有建議 salt 和 口令密文分開存儲,從安全的角度,請務(wù)必將迭代因子、salt、口令密文分開存儲。

如果想校驗口令密文,那么可以使用 password_verify() 函數(shù)校驗,貼代碼:

 
// hash 是保存在數(shù)據(jù)庫中的口令密文
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));

還可以更新口令密文,調(diào)用 password_needs_rehash() 即可,定期更新 salt,可以更安全保護(hù)口令。

最后介紹下 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 校驗口令密文是互通的,大家可以測試下。

口令保護(hù)系列文章:


了解我的書《深入淺出HTTPS:從原理的實(shí)戰(zhàn)》,如果覺得還不錯,還請在豆瓣寫個評論(https://book.douban.com/subject/30250772)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容