PHP和Python实战bcrypt算法

作者 : 开心源码 本文共1649个字,预计阅读时间需要5分钟 发布时间: 2022-05-12 共178人阅读

本文是 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");

接下去重点看下口令密文的输出 2y07$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 bcryptdef 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) == mwprint(mwjy)

Python 和 PHP 校验口令密文是互通的,大家可以测试下。

口令保护系列文章:

  • 如何安全存储口令?理解下Hash加盐的原理
  • 一个可实践的「Hash加盐」技术方案
  • 安全存储口令的业界标准:bcrypt算法
  • PBKDF2函数,比「Hash加盐」更好的口令保护方案

理解我的书《深入浅出HTTPS:从原理的实战》,假如觉得还不错,还请在豆瓣写个评论(https://book.douban.com/subject/30250772)。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » PHP和Python实战bcrypt算法

发表回复