pyca/bcrypt
GitHub: pyca/bcrypt
一款基于 Bcrypt 算法的 Python 密码哈希库,解决安全存储与验证密码的问题。
Stars: 1472 | Forks: 214
# bcrypt
.. image:: https://img.shields.io/pypi/v/bcrypt.svg
:target: https://pypi.org/project/bcrypt/
:alt: 最新版本
.. image:: https://github.com/pyca/bcrypt/workflows/CI/badge.svg?branch=main
:target: https://github.com/pyca/bcrypt/actions?query=workflow%3ACI+branch%3Amain
接受对您的软件和服务进行密码哈希处理(但您应该
确实应该使用 argon2id 或 scrypt)
# 安装
要安装 bcrypt,只需执行以下操作:
.. code:: console
```
$ pip install bcrypt
```
请注意,bcrypt 在具备 C 编译器和 Rust 编译器(最低支持 Rust 版本为 1.74.0)的 Linux 系统上可以轻松构建。
对于 Debian 和 Ubuntu 系统,可以使用以下命令安装所需依赖:
.. code:: console
```
$ sudo apt-get install build-essential cargo
```
对于 Fedora 和 RHEL 衍生版本,可以使用以下命令安装所需依赖:
.. code:: console
```
$ sudo yum install gcc cargo
```
对于 Alpine 系统,可以使用以下命令安装所需依赖:
.. code:: console
```
$ apk add --update musl-dev gcc cargo
```
# 替代方案
虽然 bcrypt 仍然是密码存储的合理选择,但根据您的具体用例,您也可以考虑使用 scrypt(通过 `standard library`_ 或 `cryptography`_)或 argon2id(通过 `argon2_cffi`_)。
# 更新日志
更新日志维护在 `CHANGELOG.rst `_
# 用法
### 密码哈希
对密码进行哈希处理并随后验证其是否与先前的哈希密码匹配非常简单:
.. code:: pycon
```
>>> import bcrypt
>>> password = b"super secret password"
>>> # Hash a password for the first time, with a randomly-generated salt
>>> hashed = bcrypt.hashpw(password, bcrypt.gensalt())
>>> # Check that an unhashed password matches one that has previously been
>>> # hashed
>>> if bcrypt.checkpw(password, hashed):
... print("It Matches!")
... else:
... print("It Does not Match :(")
```
### 密钥派生函数(KDF)
从 3.0.0 版本开始,bcrypt 提供了 `kdf` 函数,用于执行 `bcrypt_pbkdf`。
此 KDF 用于 OpenSSH 的新加密私钥格式。
.. code:: pycon
```
>>> import bcrypt
>>> key = bcrypt.kdf(
... password=b'password',
... salt=b'salt',
... desired_key_bytes=32,
... rounds=100)
```
### 可调整的工作因子
bcrypt 的一个特性是可调整的对数工作因子。要调整工作因子,只需将要的轮数传递给
``bcrypt.gensalt(rounds=12)``,默认值为 12):
.. code:: pycon
```
>>> import bcrypt
>>> password = b"super secret password"
>>> # Hash a password for the first time, with a certain number of rounds
>>> hashed = bcrypt.hashpw(password, bcrypt.gensalt(14))
>>> # Check that a unhashed password matches one that has previously been
>>> # hashed
>>> if bcrypt.checkpw(password, hashed):
... print("It Matches!")
... else:
... print("It Does not Match :(")
```
### 可调整的前缀
bcrypt 的另一个特性是可调整的前缀,允许您定义与之保持兼容的库。要调整此参数,请将 ``2a`` 或
``2b``(默认值)以字节对象形式传递给 ``bcrypt.gensalt(prefix=b"2b")``。
从 3.0.0 版本开始,``$2y$`` 前缀在 ``hashpw`` 中仍受支持但已弃用。
### 最大密码长度
向 ``hashpw`` 传递超过 72 字节的密码现在会引发 ``ValueError``。
此前密码会被静默截断,这是遵循原始 OpenBSD ``bcrypt`` 实现的行为。为解决此问题,一种常见方法是先使用加密哈希(如 ``sha256``)对密码进行哈希处理,然后进行 base64
编码以防止空字节问题,最后再使用 ``bcrypt`` 进行哈希:
.. code:: pycon
```
>>> password = b"an incredibly long password" * 10
>>> hashed = bcrypt.hashpw(
... base64.b64encode(hashlib.sha256(password).digest()),
... bcrypt.gensalt()
... )
```
## 兼容性
该库应与 py-bcrypt 兼容,并可在 Python 3.8+(包括免锁构建)以及 PyPy 3 上运行。
## 安全性
``bcrypt`` 遵循与 `cryptography`_ 相同的安全策略,如果您发现漏洞,请私下联系我们。
.. _`same security policy as cryptography`: https://cryptography.io/en/latest/security.html
.. _`standard library`: https://docs.python.org/3/library/hashlib.html#hashlib.scrypt
.. _`argon2_cffi`: https://argon2-cffi.readthedocs.io
.. _`cryptography`: https://cryptography.io/en/latest/hazmat/primitives/key-derivation-functions/#cryptography.hazmat.primitives.kdf.scrypt.Scrypt
标签:Alpine, argon2_cffi, argon2id, bcrypt, CI, C编译器, Debian, Fedora, ProjectDiscovery, pypi, Python, RHEL, Rust, scrypt, TLS抓取, XML 请求, 依赖管理, 加密, 可视化界面, 安全开发, 密码哈希, 密码存储, 密码安全, 开源, 开源框架, 持续集成, 数据保护, 无后门, 漏洞扫描器, 网络流量审计, 软件安全, 逆向工具