密码泄露检查

密码泄露检查要问数据库一个聊天机器人答不了的问题:这个密码是否出现在已知的数据泄露中?输入一个密码,本页会在浏览器中对它做哈希,只把哈希的前 5 个字符发送给 Have I Been Pwned 的 Pwned Passwords 服务,并告诉你这个密码在真实泄露中出现过多少次——密码本身永远不会离开本页。你也可以一次检查最多 50 个密码,或上传一份 SHA-1 哈希文件。配套指南你的密码是否在数据泄露中解释了这个数字的含义和下一步该做什么;要换一个全新的密码,请使用密码生成器;要找出已暴露在某个在线站点上的凭据,请使用泄露秘密扫描器。

最后更新:

你的密码永远不会离开本页

本页会在浏览器中用 SHA-1 对你的密码做哈希,只把哈希的前 5 个字符发送给 Have I Been Pwned。密码本身——甚至它的完整哈希——永远不会离开你的设备,不会被存储,也不会被记录。服务会返回所有共享这 5 个字符的哈希后缀,匹配在本设备上完成。模型的工作方式见 haveibeenpwned.com/Passwords。

检查一个密码

一次检查多个

重复的密码只检查一次。结果只显示一个编号(#1、#2…)——永远不会显示密码本身。CSV 导出只包含编号和次数。

诚实的局限

这里只检查 Pwned Passwords 泄露语料——从数百起已知数据泄露中收集的密码。“未找到”意思是“未在已知泄露中出现”,而不是“安全”。

这里不提供邮箱泄露查询:Have I Been Pwned 的邮箱泄露 API 是付费订阅服务,因此本页不会承诺免费提供它。

泄露数据:Have I Been Pwned — Pwned Passwords(haveibeenpwned.com/Passwords)。

什么是泄露语料——以及那个数字意味着什么

泄露语料是从真实数据泄露中收集的密码集合:当某个服务被攻破、其密码数据库泄露后,其中的密码——通常以哈希形式存储——会被收集、去重并编入索引,任何人都可以查询某个密码是否在其中。Have I Been Pwned 的 Pwned Passwords 语料包含来自数百起泄露的十多亿个密码,并且随着新泄露的出现还在不断增长。这种规模正是检查的意义所在:你花五秒钟想出来的密码,很可能已有成千上万的人以完全相同的形式想出来过——而如果它曾经出现在某个被攻破的数据库里,攻击者手上已经有了它,正准备拿到每一个能登录的页面去试。

这项检查靠一种叫 k-匿名(k-anonymity)的技巧,无需透露密码就能完成。密码在浏览器中用 SHA-1 做哈希,得到一个 40 个字符的指纹;只有该指纹的前 5 个字符会被发送给服务。服务返回所有共享这 5 个字符的指纹后缀——通常大约八百个——浏览器再在本地的列表中查找自己的后缀。5 个字符足以把一个密码藏在数百个长相相似的密码之中,又短到服务永远无法知道你问的是哪个密码。密码本身从不经过网络,从不进入服务器日志,也从不出现在 URL 里。

找到了、没找到——以及下一步该做什么

次数大于零,意味着这个密码在泄露中出现过那么多次。数以百万计的次数——“password” 出现过五千多万次——意味着它是每一次撞库攻击中最先尝试的猜测之一,应该在所有使用它的地方都换掉,先从邮箱和银行开始。次数很小也不算过关:即使只出现过一次,也说明这个密码已经在攻击者的字典里,而且很可能说明它遵循某种可猜的模式——名字加年份、键盘上的连续按键、把常见短语里的一个字母换成数字。两种情况的解决办法是一样的:换成一个你在任何地方都没用过的唯一密码,用密码生成器生成,保存在密码管理器里,而不是记在脑子里或记事本里。

次数为零是个好消息,但有严格的限度:它只说明这个密码没有出现在该语料所知道的泄露中。它没有说明密码是否强壮、是否容易被猜到,也没有说明它是否已经躺在某起尚未曝光的泄露里。一个短而常见的密码可能不在语料中,却仍能在几分钟内被猜测攻破;而一个在十个网站重复使用的密码,只需一起泄露就会丢掉全部十个。只有当密码同时满足长、随机、只用在一个地方这三条时,“未找到”才可以当作保留它的理由。任何一条不满足,都应该换掉——这项检查告诉你的是暴露情况,而不是强度。

永远不要把密码粘贴进聊天机器人或 AI 助手,问它是否安全。聊天会保留对话记录:你的密码会被存到别人的服务器上,被用来训练或调优模型,甚至可能在以后的回答中被原样引用——这与泄露检查的目的正好相反。同样的规则适用于任何要求你在表单里输入密码并承诺帮你评判的网站:除非像本页这样在本地做哈希并把机制展示给你,否则就默认密码正在被发送和存储。泄露检查之所以值得做,正是因为它可以在不把秘密交给任何人的情况下完成,而这一点值得守护,哪怕问题本身看起来很小。

用通俗的话说明这项检查

k-匿名只有密码哈希的前 5 个字符会离开浏览器。服务无法分辨共享这个前缀的数百个密码中,你问的是哪一个。
SHA-1 哈希密码的 40 个字符指纹,在浏览器中计算。同一个密码总是产生同一个指纹,而指纹无法被反推回密码。
Pwned Passwords 语料从数百起已知数据泄露中收集的十多亿个密码,由 Have I Been Pwned 维护,随着新泄露的出现而更新。
范围 API本页调用的公开、免费、无需密钥的 HIBP 接口:给定一个 5 字符前缀,它返回所有匹配的后缀及其泄露次数,每行一个 SUFFIX:count。
泄露次数密码在语料中出现过的次数。出现 1 次就已经说明它在攻击者的字典里;数以百万计则说明它是最先被尝试的猜测之一。
未找到密码的哈希后缀不在返回的范围里——它没有出现在已知泄露中。这不是密码强壮或安全的结论。
批量粘贴最多 50 个密码,每行一个。重复的密码只检查一次,共享 5 字符前缀的密码共用一次请求,结果只显示编号——永远不显示密码。
哈希文件最多 500 个 SHA-1 哈希,每行一个,适合那些你根本不想输入的密码。无效行会被列为跳过;结果只显示截断后的哈希。
CSV 导出批量结果的电子表格:只有打码后的标签和泄露次数。明文密码和完整哈希永远不会进入下载的文件。
邮箱泄露这里不提供。查询某个邮箱地址是否出现在泄露中,需要 HIBP 的付费邮箱 API,因此本页不会承诺免费的邮箱查询。

常见问题

我的密码会被发送给 Have I Been Pwned 吗?

不会。浏览器用 SHA-1 对密码做哈希,只发送哈希的前 5 个字符。服务返回数百个匹配的后缀,浏览器在本地检查自己的后缀。密码本身——甚至它的完整哈希——永远不会离开本页,不会被存储,也不会被记录。

“出现过 5200 万次”是什么意思?

意思是这个确切的密码在被攻破的数据库中出现过 5200 万次,横跨许多不同的泄露和账户。它是每一次撞库攻击中最先尝试的猜测之一——被盗密码会被自动拿到登录页面去试。请在所有使用它的地方换掉它,先从邮箱和银行开始,并且永远不要再重复使用它。

我的密码没有被找到,现在安全了吗?

不一定。“未找到”只说明它没有出现在该语料所知道的泄露中。一个短而可预测的密码可能不在语料中,却仍能在几分钟内被猜出来;而一个在多个网站重复使用的密码,只需一起泄露就会丢掉全部网站。只有当它同时长、随机、只用在一个地方时,才可以保留。

为什么这里不能检查邮箱地址?

检查某个邮箱地址是否出现在泄露中,用的是另一项 HIBP 服务——邮箱泄露 API——那是一项付费订阅。本页只使用免费的 Pwned Passwords 范围 API,它检查的是密码,不是邮箱地址;承诺免费提供邮箱查询会是不诚实的。

我的密码在泄露中被找到了,我先做什么?

在所有使用它的地方换掉它,先从那些保护着其他账户的账户开始——首先是邮箱,然后是银行和密码找回路径——并且永远不要在任何地方重复使用旧密码。用密码生成器生成一个全新的唯一密码,保存在密码管理器里。如果同一个密码保护着好几个账户,就把它们全部当作已经暴露,因为攻击者会把泄露的密码拿到每一个能登录的服务去试。