# 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)。