适用于您的软件和服务器的现代密码散列
项目描述
bcrypt
您的软件和服务器可接受的密码散列
安装
要安装 bcrypt,只需:
$ pip install bcrypt
请注意,如果您有 C 编译器和 Rust 编译器(支持的最低 Rust 版本为 1.56.0),bcrypt 应该很容易在 Linux 上构建。
对于 Debian 和 Ubuntu,以下命令将确保安装所需的依赖项:
$ sudo apt-get install build-essential cargo
对于 Fedora 和 RHEL-derivatives,以下命令将确保安装所需的依赖项:
$ sudo yum install gcc cargo
对于 Alpine,以下命令将确保安装所需的依赖项:
$ apk add --update musl-dev gcc cargo
备择方案
虽然 bcrypt 仍然是密码存储的可接受选择,但根据您的特定用例,您可能还需要考虑使用 scrypt(通过标准库或cryptography)或通过 argon2_cffi 使用argon2id。
变更日志
4.0.0
bcrypt现在在 Rust 中实现。从源代码构建的用户需要有可用的 Rust 编译器。下载轮子的用户不会有任何改变。
我们不再提供 manylinux2010轮子。用户应该升级到最新的 pip以确保这不会导致在他们的平台上下载轮子的问题。我们现在在足够新的平台上为用户提供许多linux_2_28轮子。
现在允许在输入中使用NUL字节。
3.2.2
修复了车轮中py.typed文件的打包问题,以便mypy工作。
3.2.1
添加了对 z/OS 上编译的支持
bcrypt的下一个版本是 4.0,它将在编译时需要 Rust,用于从源代码构建的用户。从轮子安装的用户将没有额外的要求。大多数平台上的用户将能够通过确保他们拥有最新的pip来获得轮子。支持的最低 Rust 版本为 1.56.0。
这将是我们发布manylinux2010轮子的最终版本。未来,我们的轮子支持的最低 manylinux ABI 将是 manylinux2014。绝大多数用户将继续收到 许多 Linux轮子,只要他们有最新的pip。
3.2.0
为库函数添加了类型提示。
不再支持低于 3.6 的 Python 版本(2.7、3.4、3.5)。
发货的 abi3 Windows 轮子(需要 pip >= 20)。
3.1.7
为 PEP517 车轮构建设置setuptools下限。
我们不再分发 32 位manylinux1轮子。继续生产它们是一种维护负担。
3.1.6
添加了对 Haiku 上编译的支持。
3.1.5
添加了对 AIX 上编译的支持。
放弃了对 Python 2.6 和 3.3 的支持。
切换到使用Python 3 的abi3轮子。如果您没有在兼容平台上获得轮子,请升级您的pip版本。
3.1.4
修复了使用 mingw 和 illumos 进行的编译。
3.1.3
修复了 Solaris 上的编译问题。
在kdf使用太少的回合时添加了警告。
3.1.2
修复了影响大端平台的编译问题。
修复了 Python 3.6 上的无效转义序列警告。
修复了 Python 2 上非 UTF8 环境中的构建问题。
3.1.1
与cffi 1.8.3一起使用时解决了UserWarning 。
3.1.0
添加了对checkpw的支持,这是一种验证密码的便捷方法。
确保在输入$2y$盐时获得$2y$哈希。
修复了$2a哈希易受环绕错误影响的回归问题。
修复了 Alpine Linux 下的编译。
3.0.0
将 C 后端切换到从 OpenBSD 项目而不是 openwall 获得的代码。
通过kdf函数添加了对bcrypt_pbkdf的支持。
2.0.0
在调用gensalt时添加了对可调整前缀的支持。
切换到 CFFI 1.0+
用法
密码哈希
散列然后检查密码是否与之前的散列密码匹配非常简单:
>>> 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现在提供了一个执行bcrypt_pbkdf的kdf函数。此 KDF 用于 OpenSSH 更新的加密私钥格式。
>>> import bcrypt
>>> key = bcrypt.kdf(
... password=b'password',
... salt=b'salt',
... desired_key_bytes=32,
... rounds=100)
可调功因数
bcrypt 的功能之一是可调整的对数功因数。要调整工作因子,只需将所需的轮数传递给 bcrypt.gensalt(rounds=12),默认为 12):
>>> 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 开始, hashpw仍然支持$2y$前缀,但已弃用。
最大密码长度
bcrypt 算法只处理最多 72 个字符的密码,超出的任何字符都将被忽略。为了解决这个问题,一种常见的方法是使用加密哈希(例如sha256)对密码进行哈希处理,然后对其进行 base64 编码以防止在使用 bcrypt对结果进行哈希处理之前出现 NULL 字节问题:
>>> password = b"an incredibly long password" * 10
>>> hashed = bcrypt.hashpw(
... base64.b64encode(hashlib.sha256(password).digest()),
... bcrypt.gensalt()
... )
兼容性
这个库应该与 py-bcrypt 兼容,它将在 Python 3.6+ 和 PyPy 3 上运行。
C代码
这个库使用来自 OpenBSD 的代码。
安全
bcrypt遵循与密码学相同的安全政策,如果您发现漏洞,我们要求您私下与我们联系。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。