Skip to main content

Troy Hunt 的 Pwned Passwords API 的 Python 包装器。

项目描述

CI 状态 版本 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_textTrue,以便库知道在将其发送到 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 (13.6 kB 查看哈希

已上传 py2 py3