为什么最常见的散列 (SHA1) 密码前缀是“00000”?

Why the most common prefix of hashed (SHA1) passwords is "00000"?

我正在阅读 Troy Hunt 的博客 (https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/) 中的 post,关于一个名为 "Pwned Passwords" 的功能,该功能检查您的密码是否在泄露超过 10 亿的数据库中密码。

要在不传递密码的情况下进行此检查,客户端代码对其进行哈希处理并仅传递该哈希值的前五个字符,后端 returns 所有以前缀开头的密码的 sha1 哈希值你通过了。然后,为了检查你的密码的哈希值是否在数据库中,在客户端代码上进行比较。

他还提供了一些关于这些散列密码数据的信息...

  1. Every hash prefix from 00000 to FFFFF is populated with data (16^5 combinations)
  2. The average number of hashes returned is 478
  3. The smallest is 381 (hash prefixes "E0812" and "E613D")
  4. The largest is 584 (hash prefixes "00000" and "4A4E8")

在评论中,人们想知道这个“00000”的存在是巧合还是数学...

有懂 SHA1 算法的大神能给我们解释一下吗?

这要么是巧合,要么(不太可能)是 artifact/error 在获取或组装结果以供发布时的结果。

并不是说它看起来像一个重要的异常值。所描述的分布(381 分钟,平均 478,最大 584)似乎是样本量的均匀分布。整个语料库的图表可能看起来很随机。

与任何构造合理的哈希算法一样,SHA1 结果中的字符频率应该是随机分布的。 (如果 SHA1 有某种偏差,这将是数学和 cryptography/cryptology 社区的重大新闻!)

好吧,由于密码最初来自数据泄露,我最好的猜测是其中一个被破坏系统中的密码 table 被排序或聚类(未加盐 - 那些人是那种人谁的密码被盗)密码的 SHA1 散列。当系统被攻破时,攻击者从“00000”哈希值开始,只是没有成功...

或者 Troy 使用的列表可能包含 SHA1 彩虹的第一部分 table (https://en.wikipedia.org/wiki/Rainbow_table)...

或者类似的东西。基本思想是密码的 SHA1 散列是密码选择过程的一部分。

有人需要根据 sha1 算法检查我的猜测(并且 troy 可能已经揭穿了它,因为根据他的博客回答,他“在 [纯文本] 密码上达到了顶峰)但是因为密码只是 alpha/numeric 和 ASCII 中描述的有限符号创建哈希将始终以零的第一位开始工作(ascii 是 0-255,但我相信使用的字母数字和符号在 32-98 范围内,所以每 8 个的第一位bits always zero) 虽然它是散列的函数来掩盖这一点,但我怀疑可预测的位定位并不像人们预期的那样容易混淆。虽然它与 4 相关,但 0 是位形式的 00000000 而 4 是 00000100所以两者的前五位都是 0,

还要注意两个最不频繁的散列 headers 都以 E 开头,在二进制中是 11111110,因此它们在构造(1 对 0)和频率(低对高)方面几乎完全相反,这意味着零位的存在可能是算法的副作用(值得怀疑),也可能是算法在按惯例倾斜的有限子集上的函数,换句话说,字母和数字仅占算法的 1/3 - 1/4最有可能

的 ASCII 描述的完整范围

我们当然可以 "tin foil hat" 参加这个会议,但我敢打赌巧合和 ASCII 比草丘上的那个人更应该受到指责