多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Python `bcrypt`教程 > 原文: [http://zetcode.com/python/bcrypt/](http://zetcode.com/python/bcrypt/) Python `bcrypt`教程展示了如何使用`bcrypt`库对 Python 中的密码进行哈希处理。 它定义了基本术语,包括加密,哈希和盐。 Python `bcrypt`模块是一个用于在 Python 中生成强哈希值的库。 它通过`pip install bcrypt`命令安装。 ## 加密 加密是对消息或信息进行编码的过程,以使只有授权人员才能使用相应的键读取消息或信息,而未经授权的人员则不能。 预期的信息或消息,称为纯文本,使用加密算法-密码-加密,生成密文,只有解密后才能读取。 加密是一种双向函数。 当我们加密某些东西时,我们这样做是为了以后对其进行解密。 加密用于传输时保护数据; 例如在邮件通讯中。 ## 哈希 哈希是使用算法将任意大小的数据映射到固定长度的过程。 这称为哈希值。 加密是一种双向功能,而哈希是一种单向函数。 尽管在技术上可以反向哈希值,但所需的计算能力使其不可行。 加密是为了保护传输中的数据,而哈希是为了验证数据没有被更改并且是真实的。 > **注意**:哈希不限于安全性。 它还用于比较大量数据或快速键查找。 密码不是以纯文本格式存储在数据库中,而是以哈希值存储。 ## 盐 盐是固定长度的加密强度强的随机值,将其添加到哈希函数的输入中以为每个输入创建唯一的哈希。 添加盐可以使密码哈希输出唯一,即使对于采用通用密码的用户也是如此。 ## `bcrypt`哈希函数 `bcrypt`是 Niels Provos 和 DavidMazières 基于 Blowfish 密码设计的密码哈希函数。 `bcrypt`函数是 OpenBSD 的默认密码哈希算法。 有针对 C,C++ ,C# ,Java,JavaScript,PHP,Python 和其他语言的`bcrypt`实现。 `bcrypt`算法使用强大的加密技术为我们创建哈希并加盐。 该算法的计算成本是参数化的,因此随着计算机变得越来越快,它可能会增加。 计算成本被称为工作因子或成本因子。 它减慢了哈希的速度,使暴力破解的尝试越来越难。 随着计算机变得越来越快,最佳成本因数会随着时间而变化。 高成本因素的缺点是增加了系统资源的负载并影响了用户体验。 ## Python `bcrypt`创建哈希密码 在下一个示例中,我们创建一个哈希密码。 `create_hashed_password.py` ```py #!/usr/bin/env python3 import bcrypt passwd = b's$cret12' salt = bcrypt.gensalt() hashed = bcrypt.hashpw(passwd, salt) print(salt) print(hashed) ``` 该示例使用`bcrypt`创建一个盐和一个哈希密码。 ```py import bcrypt ``` 我们导入`bcrypt`模块。 ```py salt = bcrypt.gensalt() ``` 用`gensalt()`函数生成盐。 ```py hashed = bcrypt.hashpw(passwd, salt) ``` 使用`hashpw()`函数创建一个哈希值,该函数将明文值和盐作为参数。 ```py $ python first.py b'$2b$12$mwSIOyxLJid1jFLgnU0s0.' b'$2b$12$mwSIOyxLJid1jFLgnU0s0.7pmzp8Mtx.GEO30x0AbI2v8r2sb98Cy' $ python first.py b'$2b$12$MgGs11HIXGkg1Bm1Epw0Du' b'$2b$12$MgGs11HIXGkg1Bm1Epw0Du20TV8ppi2Latgq7kKng8UjM5ZFWKKeS' ``` 请注意,盐是生成的哈希值的第一部分。 还要注意,每次生成唯一的盐和哈希值。 ## Python `bcrypt`检查密码 下面的示例根据哈希值检查密码。 `check_passwd.py` ```py #!/usr/bin/env python3 import bcrypt passwd = b's$cret12' salt = bcrypt.gensalt() hashed = bcrypt.hashpw(passwd, salt) if bcrypt.checkpw(passwd, hashed): print("match") else: print("does not match") ``` 使用`checkpw()`函数检查密码。 ```py $ python check_passwd.py match ``` 这是输出。 ## Python `bcrypt`成本因子 成本因子通过减慢哈希来提高安全性。 `cost_factor.py` ```py #!/usr/bin/env python3 import bcrypt import time passwd = b's$cret12' start = time.time() salt = bcrypt.gensalt(rounds=16) hashed = bcrypt.hashpw(passwd, salt) end = time.time() print(end - start) print(hashed) ``` 我们使用`rounds`参数将成本因子设置为 16。 我们测量生成密码哈希的时间。 ```py $ cost_factor.py 4.268407821655273 b'$2b$16$.1FczuSNl2iXHmLojhwBZO9vCfA5HIqrONkefhvn2qLQpth3r7Jwe' ``` 花费超过四秒钟的时间来生成具有指定成本因子的哈希值。 在本教程中,我们使用了 Python `bcrypt`模块来生成密码哈希。 您可能也对以下相关教程感兴趣: [Python 教程](/lang/python/), [Python 列表推导](/articles/pythonlistcomprehensions/)或[所有 Python 教程](/all/#python)。