破解者如何如此快速地重建 200k 加盐密码哈希?

信息安全 密码 sha256
2021-08-17 22:25:13

我正在研究一个关于网络安全的小讨论,我发现了一篇关于 formspring hack 的文章,这让我很好奇。他们声称使用了 SHA-256 + 盐

我们能够立即修复漏洞并将我们的散列机制从带有随机盐的 sha-256 升级到 bcrypt 以加强安全性(2012 年 7 月 10 日)

…尽管如此,攻击者声称他们在已发布的 40 万个数据集中找到了约 20 万个密码(他们有 1100 万用户,恕我直言,他们中的大多数可能已被复制)。

400,000 个哈希值中约有一半已被密码破解者重建。(2012 年 7 月 11 日)

这在我看来很可疑。我知道如果不使用 PKCS#5 或类似技术,SHA-256 的安全性是有限的,但是他们需要多少计算能力才能这么快找到这么多密码?

我的猜测是 formspring 在散列方面撒谎。有人对此有一些见解吗?

4个回答

现有的答案都没有涵盖这个问题的关键部分,令我满意:盐呢?

如果只发布密码哈希值,其他破解者不可能知道:

  1. 实际的每个密码(假设是随机的,每个源)盐值。

  2. 盐如何与代码中的密码混合。

他们所拥有的只是最终的哈希值!

很多方法可以组合密码和盐来形成哈希:

sha256(pass + salt)
sha256(salt + pass)
sha256(sha256(pass) + sha256(salt))
sha256(pass + sha256(salt))
sha256(sha256(...(salt + pass + salt)...))

但是如果盐是推荐的8个纯随机字符……

sha256("monkey1" + "w&yu2P2@")
sha256("w&yu2P2@" + "monkey1")

……这意味着“典型”的 7 或 8 个字符的密码变得非常难以暴力破解,因为它实际上是 15 个或更多字符!此外,要破解你知道是加盐的密码哈希,除非你也有盐,否则除了蛮力你别无选择!

根据我使用 GPU 破解所做的研究,我使用两张高端 ATI 卡暴​​力破解 MD5 密码哈希实现了 8213.6 M c/s。在我的基准测试中,这意味着我可以尝试:

all 6 character password MD5s   47 seconds
all 7 character password MD5s   1 hour, 14 minutes
all 8 character password MD5s   ~465 days
all 9 character password MD5s   fuggedaboudit

请注意,SHA-256 在使用Hashcat的 GPU 上是 MD5 速度的 13% 。因此,将这些数字乘以大约 8 以查看需要多长时间。

如果不知道,这意味着您实际上是在强制使用相当于 12 个以上字符的密码。这远远超出了任何已知计算能力的范围。

现在,如果您想争辩……

  1. 原始饼干也获得了盐,但选择不发布它们。

  2. 原始破解者也有源代码(或者它开源的),所以他们知道密码是如何加盐的,但选择不发布该信息。

  3. Formspring 在撒谎,他们的密码没有加盐或加盐不当,因此盐没有效果。

......那么是的,在几天内破解 200k 的 400k 密码哈希是很容易的。


编辑:以下所有内容都假设盐是已知的,因为这是 salt (3rd line) 这个词的行业标准用法

就像这在数据库中经常出现的一个例子一样,看看这个SHA-256 Unix Crypt输出:

$5$rounds=80000$wnsT7Yr92oJoP28r$cKhJImk5mfuSKV9b3mumNzlbstFUplKtQXXMo4G6Ep5

..wnsT7Yr92oJoP28r明文中的盐在哪里。Python Passlib 文档对许多常见的散列密码格式进行了很好的描述,其中大多数将明文盐与散列密码表示连接在一起。

@Jeff Atwood 讨论的“攻击者不知道的盐”通常被称为“胡椒”。请参阅密码哈希添加盐 + 胡椒或盐是否足够?


2009 年,Daniel J. Bernstein 为 NVIDIA 的 CUDA 框架编写了高度优化的 SHA-1 实现。那时,他们使用四张显卡在一台服务器上每秒管理 6.9 亿次 SHA-1 哈希。

针对散列密码的蛮力攻击是一种“令人尴尬的并行”工作负载2010 年,Thomas Roth 展示了使用 Amazon EC2以大约 2 美元的价格暴力攻击大约 10 个哈希。这可以很容易地扩大规模,如果速率不够高,那么只需添加更多 EC2 实例。

所以本质上这不是暴力破解密码需要多长时间的问题。更多的是攻击者愿意或能够支付多少计算能力以更快地获得结果的问题。

攻击者声称他们已经找到了大约 200.000 个密码

一种合理的解释是,攻击者没有针对特定的散列表示,他们只是为了“低垂的果实”。换句话说,他们只寻找“容易猜到”的密码。也许是这样的:

  • 最常见的明文密码候选列表,由公开的实际用户密码列表构建。(多年来,真实用户密码已多次泄露。)
  • 也许他们还尝试了所有可发音的小写密码,直到上限,例如最多 6 个字符。(在上面的 2006 年 MySpace 数据集中,发现 17% 的最终用户密码为 6 个或更少的字符。)

我的猜测是 formspring 在散列方面撒谎。

如果我正确理解了您的链接,那么哈希值是在 7 月 7 日的一个论坛上发现的。但它们可能在那之前几周或几个月就从 Formspring 被盗了?

鉴于我上面的描述,正如 Formspring 所说,使用单轮 SHA256 和每个密码唯一的盐对我来说似乎不是不合理的。

这完全取决于攻击者在暴力破解中投入了多少时间和精力。但在一小群个人黑客可能拥有的资源范围内,从 1100 万个简单的 SHA-256 散列表示的数据集中发现 200.000 个弱密码似乎是合理的。

破解未加盐的散列相当简单:您只需在预先计算的表中查找散列并找到答案。暴力破解其余部分毫无意义,因为您的彩虹表已经涵盖了您的暴力破解字典。

但是破解加盐密码仍然很简单;较慢但仍然简单。在大多数蛮力攻击中,攻击者追求的是广度而不是深度。他没有针对 1 个帐户尝试 10 亿个密码,而是针对所有帐户尝试了数十、数百或数千个常见密码。彩虹表当然更快,但仅盐并不妨碍经典的蛮力方法。从字典的顶部开始,对所有帐户尝试该密码:这显然涉及重新计算每个帐户的哈希值,但另一方面,您被击中的机会非常高(这正是“通用密码”的含义, 反正)。接下来,获取下一个最常用的密码,然后是下一个,等等。

最终你可能只打通了几千个密码,但从统计上来说,你的列表中可能有数百个密码为“123456”的帐户,并且使用“password1”和“111111”和“test”的帐户数量相当多.

11M中有200K是可信的;仅约 2%。少了 400K 中的 200K。并非不可能,但可能性不大。收益递减规律在某处起作用;我不确定有多远,但它可能是一个非常简单的比率,例如 1/ e之类的。除此之外,我对此表示怀疑。

他们没有说谎是有道理的。

  1. 正如@Jeff 指出的那样,访问盐对于快速破解至关重要,但正如@Remus Rusanu 指出的那样:“如果他们获得了哈希值,那么我很难看出他们怎么也不能获得盐”,因为它们必须被存储以使它们可以相互关联的方式。我会假设:至少最初的黑客可以使用盐。1

  2. @Jeff 还指出,他们必须有权访问源代码才能知道盐和密码是如何组合的。我提出了一种不同的方法来找出盐和密码的组合方式:

    1. 让我们假设他们在攻击之前有一个 formspring 帐户(一个非常合理的假设)
    2. 在获得的列表中查找该特定帐户(盐、哈希)
    3. 知道密码、盐和产生的散列,应该很容易构建一个小脚本来测试所有合理(和一些不合理)组合密码和盐的方式(不超过几千种方式?)
    4. ???
    5. 利润!
  3. 他们声称拥有“数千万会员”,这使得@Jesper低挂水果理论听起来非常合理。

好吧,他们仍然可以撒谎,但至少听起来他们没有撒谎是合理的。

1. 如果这个假设是错误的——最初的黑客没有公布盐,也没有尝试自己破解密码——其余的可能是不可能的。