ZetCode

Python bcrypt

最后修改于 2024 年 1 月 29 日

Python bcrypt 教程展示了如何使用 bcrypt 库在 Python 中哈希密码。它定义了诸如加密、哈希和盐值等基本术语。

Python bcrypt 模块是一个用于在 Python 中生成强哈希值的库。它可以通过 pip install bcrypt 命令进行安装。

加密

加密 是将消息或信息编码,使其只有授权人员能够通过相应的密钥读取,而未经授权的人无法读取。目标信息或消息,称为明文,使用加密算法(即密码)进行加密,生成密文,只有在解密后才能读取。加密是一个双向函数。当我们加密某些内容时,我们打算稍后解密它。加密用于在传输过程中保护数据;例如,在邮件通信中。

哈希

哈希 是使用算法将任意大小的数据映射到固定长度的过程。这称为哈希值。虽然加密是双向函数,但哈希是单向函数。尽管从技术上讲可以逆向哈希一个值,但所需的计算能力使其不切实际。加密旨在保护传输中的数据,而哈希则用于验证数据未被篡改且是真实的。

注意:哈希不仅限于安全性。它还用于比较大量数据或快速查找键。

密码不会以明文形式存储在数据库中,而是以哈希值的形式存储。

盐值

盐值 是一个固定长度的、密码学上强大的随机值,它被添加到哈希函数的输入中,为每个输入创建唯一的哈希值。添加盐值是为了使密码哈希输出在即使是采用常用密码的用户之间也是唯一的。

bcrypt 哈希函数

bcrypt 是由 Niels Provos 和 David Mazières 设计的密码哈希函数,基于 Blowfish 密码。bcrypt 函数是 OpenBSD 的默认密码哈希算法。bcrypt 有 C、C++、C#、Java、JavaScript、PHP、Python 和其他语言的实现。

bcrypt 算法使用强大的加密技术为我们创建哈希值和盐值密码。该算法的计算成本是参数化的,因此随着计算机速度的提高,可以增加该成本。计算成本称为工作因子成本因子。它减慢了哈希速度,使得暴力破解尝试更困难、更慢。随着计算机速度的提高,最佳成本因子会随时间变化。高成本因子的缺点是增加了系统资源的负载并影响用户体验。

Python bcrypt 创建哈希密码

在下一个示例中,我们创建一个哈希密码。

create_hashed_password.py
#!/usr/bin/python

import bcrypt

passwd = b's$cret12'

salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(passwd, salt)

print(salt)
print(hashed)

该示例使用 bcrypt 创建一个盐值和一个哈希密码。

import bcrypt

我们导入 bcrypt 模块。

salt = bcrypt.gensalt()

使用 gensalt 函数生成盐值。

hashed = bcrypt.hashpw(passwd, salt)

使用 hashpw 函数创建哈希值,该函数以明文值和盐值作为参数。

$ 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
#!/usr/bin/python

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 函数检查密码。

$ python check_passwd.py
match

Python bcrypt 成本因子

成本因子通过减慢哈希速度来提高安全性。

cost_factor.py
#!/usr/bin/python

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 参数。我们测量生成密码哈希所需的时间。

$ cost_factor.py
4.268407821655273
b'$2b$16$.1FczuSNl2iXHmLojhwBZO9vCfA5HIqrONkefhvn2qLQpth3r7Jwe'

使用指定的成本因子生成哈希值花费了超过四秒钟。

来源

Python bcrypt Github 页面

在本文中,我们使用了 Python bcrypt 模块来生成密码哈希。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程

s