特洛伊亨特pwned密码api的python包装器。
pwnedpasswords的Python项目详细描述
pwnedpasswords
是一个小的python包装器和命令行实用程序,允许您使用Pwned Passwords v2 API检查密码短语是否已被pwned。所有提供的密码数据在发送到api之前都是k-anonymized,因此明文密码永远不会离开您的计算机。
来自https://haveibeenpwned.com/API/v2#PwnedPasswords:
Pwned Passwords are more than half a billion passwords which have previously been exposed in data breaches. The service is detailed in the launch blog post then further expanded on with the release of version 2. The entire data set is both downloadable and searchable online via the Pwned Passwords page.
安装
pwnedpasswords可通过PyPi下载。您可以立即使用pip安装它。
pip install pwnedpasswords
使用量
importpwnedpasswordspwnedpasswords.check("testing 123")# Returns 1
安全说明
任何明文密码都不能使用pwnedpasswords离开您的计算机。
这是怎么回事?好吧,pwned passwords v2 api有一个非常酷的k-anonymity实现。
来自https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/:
Formally, a data set can be said to hold the property of k-anonymity, if for every record in a released table, there are k − 1 other records identical to it.
这只允许我们提供所讨论密码的sha-1散列的前5个字符。然后,api用带有该前缀的sha-1散列后缀列表进行响应。平均来说,这个列表包含478个结果。
比我聪明的人用math来证明5个字符的前缀足以维持这个数据库的k-匿名性。
简而言之:如果使用此库,明文密码将受到保护。你不会泄露足够的数据来识别你正在搜索的密码。
注释
pwnedpasswords会自动检查您提供的输入是否像sha-1散列。如果是的话,就不会做任何进一步的处理了。如果它看起来像纯文本,它会在发送到pwned passwords api之前自动散列它。
如果您想提供一个已经散列的密码作为pwnedpasswords的输入,则无需执行任何操作--pwnedpasswords将检测到它看起来像一个sha-1散列,并且在将其发送到range
端点之前不会再次散列它。
pwnedpasswords.check("b8dfb080bc33fb564249e34252bf143d88fc018f")
同样,如果密码看起来像sha-1散列(即,匹配regex[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密码数据库中找到的条目数。
如果要防止输入出现在历史记录中,请指定--stdin
参数,以通过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返回一个等于结果计数的BASE-10日志的退出代码,加上1。如果API中没有匹配项,则退出状态将是^ {CD14}}。虽然返回BASE-10日志可能看起来很奇怪,但请注意,大多数系统要求退出状态代码在0~127的范围内,并且我希望状态代码提供^ {EM1} $一些EEM>严重性指示。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收集此数据并提供此服务。
作者
丹·洛温赫兹/(@dlo)
另请参见
django-pwnedpasswords-validator,使用此库根据pwned passwords api检查用户密码的验证器。
许可证
apache许可证,2.0版。有关详细信息,请参见LICENSE。