Troy Hunt 的 Pwned Passwords API 的 Python 包装器。
项目描述
pwnedpasswords是一个小型 Python 包装器和命令行实用程序,可让您使用Pwned Passwords v2 API检查密码是否已被 pwned 。所有提供的密码数据在发送到 API 之前都经过k 匿名化处理,因此明文密码永远不会离开您的计算机。
来自https://haveibeenpwned.com/API/v2#PwnedPasswords:
Pwned Passwords 是超过 50 亿个密码,这些密码以前曾因数据泄露而暴露。该服务在发布博客文章中有详细介绍,然后随着版本 2 的发布进一步扩展。整个数据集都可以通过 Pwned Passwords 页面在线下载和搜索。
安装
pwnedpasswords 可通过PyPi下载。您可以使用 pip 立即安装它。
pip install pwnedpasswords
用法
import pwnedpasswords
pwnedpasswords.check("testing 123")
# Returns 1
安全说明
任何明文密码都不会使用 pwnedpasswords 离开您的机器。
这是如何运作的?好吧,Pwned Passwords v2 API 有一个非常酷的 k-匿名实现。
来自https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/:
形式上,可以说一个数据集具有k-匿名性,如果对于发布的表中的每条记录,都有k-1条其他记录与之相同。
这允许我们只提供相关密码的 SHA-1 哈希的前 5 个字符。然后 API 会以带有该前缀的 SHA-1 哈希后缀列表进行响应。平均而言,该列表包含 478 个结果。
比我聪明的人已经使用数学来证明 5 个字符的前缀足以维护该数据库的 k 匿名性。
简而言之:如果你使用这个库,你的明文密码就会受到保护。您不会泄露足够的数据来识别您正在搜索的密码。
笔记
pwnedpasswords 会自动检查您提供的输入是否看起来像 SHA-1 哈希。如果是,它不会做任何进一步的处理。如果它看起来像纯文本,它会在将其发送到 Pwned Passwords API 之前自动对其进行哈希处理。
如果你想提供一个已经散列的密码作为 pwnedpasswords 的输入,你不需要做任何事情——pwnedpasswords 会检测到它看起来像一个 SHA-1 散列并且在发送之前不会再次散列它range端点。
pwnedpasswords.check("b8dfb080bc33fb564249e34252bf143d88fc018f")
同样,如果密码看起来像 SHA-1 哈希(即,匹配正则表达式[0-9a-fA-F]{40})但实际上是用户提供的密码,则设置plain_text为True,以便库知道在将其发送到 API 之前对其进行哈希处理。
pwnedpasswords.check("1231231231231231231231231231231231231231", plain_text=True)
细节
check
这是首选方法。默认情况下,该check方法使用https://api.pwnedpasswords.com/range/端点,即k-anonymous。
pwnedpasswords.check("mypassword")
# 34729
如果您想强制 pwnedpasswords 使用搜索端点 ( https://api.pwnedpasswords.com/pwnedpassword/ ),请将anonymous参数设置为False.
pwnedpasswords.check("password", anonymous=False)
# 3303003
如果您希望获得更快的响应时间,并且不担心泄露您通过网络搜索的密码,您可能想要这样做。
如果您想直接访问搜索和范围端点,也可以直接调用它们。
range
pwnedpasswords.range("098765")
# outputs a dictionary mapping SHA-1 hash suffixes to frequency counts
命令行实用程序
pwnedpasswords 捆绑了一个方便的命令行实用程序。
$ pwnedpasswords 123456password
240
输出只是在 Pwned Passwords 数据库中找到的条目数。
如果您想防止输入出现在您的历史记录中,请指定--stdin参数以通过标准输入提供输入(h/t 到@tveastman请求此)。
$ pwnedpasswords --stdin
mypassword
34729
如需帮助,只需提供-h命令行参数即可。
$ pwnedpasswords -h
usage: pwnedpasswords [-h] [--verbose] [--plain-text] (--stdin | password)
Checks Pwned Passwords API to see if provided plaintext data was found in a
data breach.
positional arguments:
password The password or hashed password to search for.
optional arguments:
-h, --help show this help message and exit
--verbose Display verbose output.
--plain-text Specify that the provided input is plain text, even if it
looks like a SHA-1 hash.
--stdin Read provided input from stdin.
笔记
CLI 返回的退出代码等于结果计数的以 10 为底的日志加 1。如果 API 中没有匹配项,退出状态将为0. 虽然返回 base-10 日志可能看起来很奇怪,但请注意,大多数系统要求退出状态代码在 0-127 范围内,我希望状态代码提供一些严重性指示。log(N) 似乎是一个很好的权衡。退出状态为 log(N)+1,因为数据库中有很多匹配项,其中 1 个匹配项。
如果您想深入了解一下以确保一切正常,请设置--verbose标志。
$ pwnedpasswords 123456password --verbose
INFO:pwnedpasswords.pwnedpasswords:https://api.pwnedpasswords.com/range/5052C
INFO:pwnedpasswords.pwnedpasswords:Entry found
240
谢谢
特别感谢Troy Hunt收集这些数据并提供此服务。
作者
丹 Loewenherz / ( @dlo )
也可以看看
django-pwnedpasswords-validator,一个使用这个库根据 Pwned Passwords API 检查用户密码的验证器。
执照
Apache 许可证,版本 2.0。有关详细信息,请参阅许可证。
项目详情
pwnedpasswords -2.0.0-py2.py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 8323cf3802d5021b1f212d5f441831057a80f33bf933eb0889020c7b698e96e6 |
|
| MD5 | b1bf5a06ae08fe9e0b4810c51d8e0596 |
|
| 布莱克2-256 | 45312d6ced6b66be3be9078575a83b4bdcf7eabc4d7a2230f868e6900aeb560f |