首页 / PYTHON / Python bcrypt使用
Python bcrypt使用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python bcrypt使用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4372字,纯文字阅读大概需要7分钟。
内容图文
![Python bcrypt使用](/upload/InfoBanner/zyjiaocheng/1334/7e48196dd1d347e09da4b45734074fae.jpg)
官网:https://pypi.org/project/bcrypt/
Python bcrypt 教程展示了如何使用 bcrypt 库对 Python 中的密码进行哈希处理。 它定义了基本术语,包括加密,哈希和盐。
Python bcrypt模块是一个用于在 Python 中生成强哈希值的库。
加密
加密是对消息或信息进行编码的过程,以使只有授权人员才能使用相应的键读取消息或信息,而未经授权的人员则不能。 预期的信息或消息,称为纯文本,使用加密算法-密码-加密,生成密文,只有解密后才能读取。 加密是一种双向功能。 当我们加密某些东西时,我们这样做是为了以后对其进行解密。 加密用于传输时保护数据;
散列
哈希是使用算法将任意大小的数据映射到固定长度的过程。 这称为哈希值。 加密是一种双向功能,而散列是一种单向功能。 尽管在技术上可以反向散列值,但所需的计算能力使其不可行。 加密是为了保护传输中的数据,而散列是为了验证数据没有被更改并且是真实的。
注意: 哈希不限于安全性,它还用于比较大量数据或快速键查找。
密码不是以纯文本格式存储在数据库中,而是以散列值存储。
盐
盐是固定长度的加密强度强的随机值,将其添加到哈希函数的输入中以为每个输入创建唯一的哈希。 添加盐可以使密码哈希输出唯一,即使对于采用通用密码的用户也是如此。
bcrypt 哈希函数
bcrypt 是 Niels Provos 和 DavidMazières 基于 Blowfish 密码设计的密码哈希功能。 bcrypt 函数是 OpenBSD 的默认密码哈希算法。 有针对 C,C++ ,C# ,Java,JavaScript,PHP,Python 和其他语言的 bcrypt 实现。
bcrypt 算法使用强大的加密技术为我们创建哈希并加盐。 该算法的计算成本是参数化的,因此随着计算机变得越来越快,它可能会增加。 计算成本被称为工作因子或成本因子。 它减慢了散列的速度,使暴力破解的尝试越来越难。 随着计算机变得越来越快,最佳成本因数会随着时间而变化。 高成本因素的缺点是增加了系统资源的负载并影响了用户体验。
用法
密码哈希
哈希,然后再检查密码是否与先前的哈希密码匹配非常简单:
hashpw(password: bytes, salt: bytes) -> bytes 生成哈希函数
gensalt(rounds: int = 12, prefix: bytes = b"2b") -> bytes, 生成盐函数,rounds 为 4 < rounds > 31;prefix默认b"2b",只接受b"2a"和b"2b"。使用了os.urandom(16)取盐,该函数的值是难以预料的。
import bcrypt
password = b"super secret password"
# 生成哈希
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
print(hashed)
if bcrypt.checkpw(password, hashed):
# 检查haxi是否匹配
print(bcrypt.checkpw(password, hashed), "Is Matches!")
else:
print("It Does not Match :(")
# 取盐
print(bcrypt.gensalt(rounds=20, prefix=b"2b"))
结果,结果是随机的
b‘$2b$12$lphyi9EvJ3gF7JxlLMOg1e.lM475s4sRm4yoxqyzwaCmR21tA0/5S‘
True Is Matches!
b‘$2b$20$m63mXtOepb8Ts/kAkURlh.‘
KDF
从3.0.0版本开始,bcrypt现在提供了一个执行bcrypt_pbkdf的kdf函数。 此KDF用于OpenSSH的较新的加密私钥格式。
kdf(
password: bytes,
salt: bytes,
desired_key_bytes: int,
rounds: int,
ignore_few_rounds: bool = False,
) -> bytes
import bcrypt
key = bcrypt.kdf(password=b"password",
salt=b‘salt‘,
desired_key_bytes=32,
rounds=100)
print(key, "长度: {}".format(len(key)))
if key == b‘W\x1cq\xbd\xf25W\xf9\xe7\x99\x0fH\xfb\x1a-:n\xbd\x03\xd0\x1a>\x12\xa7\xf7\x0b\x85\x03\xc9\xf9\xbe8‘:
print(‘OK‘)
结果,结果是固定的
b‘W\x1cq\xbd\xf25W\xf9\xe7\x99\x0fH\xfb\x1a-:n\xbd\x03\xd0\x1a>\x12\xa7\xf7\x0b\x85\x03\xc9\xf9\xbe8‘ 长度: 32
OK
可调成本因子
bcrypt的特点之一是可调的对数工作系数。要调整工作系数,只需将所需的轮数传递给bcrypt.gensalt(轮数=12),默认为12)。rounds值不能小于4大于31。rounds值越大,消耗时间越久。rounds=12的时候解密需要1秒。
import bcrypt
import time
password = b"super secret password"
# 生成哈希
start = time.time()
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
print(hashed)
if bcrypt.checkpw(password, hashed):
# 检查哈希是否匹配
print(bcrypt.checkpw(password, hashed), "Is Matches!")
else:
print("It Does not Match :(")
end = time.time()
print(end - start)
结果
b‘$2b$12$2Qq8YEg792CBQ5ZcjyTkGegEDMhQj43AQi6AvLLRnPd4X9T8c6TtO‘
True Is Matches!
0.8227245807647705
import bcrypt
import time
password = b"super secret password"
# 生成哈希
start = time.time()
hashed = bcrypt.hashpw(password, bcrypt.gensalt(14))
print(hashed)
if bcrypt.checkpw(password, hashed):
# 检查哈希是否匹配
print(bcrypt.checkpw(password, hashed), "Is Matches!")
else:
print("It Does not Match :(")
end = time.time()
print(end - start)
结果
b‘$2b$14$LT08fNC1ifc2SNR2NwWyBu6oLvl7TdGZCkhVaSNTalyTZYL0l9awa‘
True Is Matches!
3.3439481258392334
import bcrypt
import time
password = b"super secret password"
# 生成哈希
start = time.time()
hashed = bcrypt.hashpw(password, bcrypt.gensalt(31))
print(hashed)
if bcrypt.checkpw(password, hashed):
# 检查哈希是否匹配
print(bcrypt.checkpw(password, hashed), "Is Matches!")
else:
print("It Does not Match :(")
end = time.time()
print(end - start)
可调前缀
bcrypt的另一个特性是一个可调前缀,让您定义将与哪些库保持兼容。要对此进行调整,只可以将2a或2b(默认值)作为一个bytes对象传递给bcrypt.gensalt(prefix=b"2b")。
部分源码
...
def gensalt(rounds: int = 12, prefix: bytes = b"2b") -> bytes:
if prefix not in (b"2a", b"2b"):
raise ValueError("Supported prefixes are b‘2a‘ or b‘2b‘")
...
从3.0.0开始,hashpw仍然支持$2y$前缀,但已不赞成使用。
最大密码长度
bcrypt算法最多只能处理72个字符的密码,超出此范围的任何字符都会被忽略。 要解决此问题,一种常见的方法是使用密码哈希(例如sha256)对密码进行哈希处理,然后使用bcrypt对结果进行哈希处理,然后对其进行base64编码,以防止出现NULL字节问题:
import base64
import hashlib
import bcrypt
password = b"an incredibly long password" * 10
hashed = bcrypt.hashpw(base64.b64encode(hashlib.sha256(password).digest()),
bcrypt.gensalt()
)
print(hashed, "长度 :{}".format(len(hashed)))
结果,结果是随机的
b‘$2b$12$2bEQlhCZUYGelslTxbuFDOtgtnrklLgoSTaHuU5eyiL0R.Ejar0yS‘ 长度 :60
兼容性
这个库应该与py-bcrypt兼容,并且可以在Python 3.6+和PyPy 3上运行。
C代码
这个库使用来自OpenBSD的代码。
安全
bcrypt遵循与密码学相同的安全策略。
原文:https://blog.51cto.com/6184526/2549299
内容总结
以上是互联网集市为您收集整理的Python bcrypt使用全部内容,希望文章能够帮你解决Python bcrypt使用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。