为什么 SHA-256 不适合密码?

信息安全 密码 密码学 哈希 sha256
2021-08-23 01:09:13

我刚刚开始了解所有这些,但我在任何地方都找不到答案,即为什么 SHA-256 不用于密码?我发现原因是因为普通的 SHA-256 是一个快速函数,最好使用较慢的函数,但这是我没有真正得到的部分,从我目前所读的内容来看,SHA-256 会产生一个需要很多年才能破解的哈希,比如很多很多,那么当它基本上不可能破解时,为什么认为它对密码有害呢?

2个回答

这一切都是为了降低整体损失风险。一个好的散列算法使得不可能反转散列值来计算原始文本。但是,密码非常非常短。通过猜测密码,攻击者可以将其 SHA-256 的输出与他在数据库中找到的 SHA-256 进行比较。而且由于密码很短,因此以这种方式测试许多密码猜测对计算机来说很容易。花几千美元,你可以建造一台专门用于 SHA-256 测试的小型超级计算机(类似于用于比特币挖掘的那些),它使攻击者能够每秒测试 16万亿次不同的密码猜测。这比试图破解 SHA-256 有效得多。

散列密码并不是要试图防止破解任何一个密码。网站所有者更加担心,因为他们拥有一个拥有一百万用户的数据库,当攻击者入侵时,他们经常窃取密码数据库的副本。他们想让攻击者难以破解他们数据库中的所有密码。

大多数攻击者都是受金钱驱使的,他们并不仅仅致力于破解一个特定帐户的密码。他们对整个数据库进行暴力攻击。如果一个用户的密码是abc123,并且它被保存为 SHA-256 哈希,那么他们将获得一个帐户。但是,如果一千个用户都拥有相同的密码,他们就会得到一千个帐户。通常情况下,数据库中 20-50% 的帐户具有非常容易猜到的密码。在百万帐户数据库中,这可能意味着他们可以破解 50 万个帐户。

使用专用硬件(或僵尸网络僵尸阵列),攻击者可以轻松破解典型数据库中的大量密码,而这些密码仅受到一次 SHA-256 迭代的保护。在一个站点上破解密码使攻击者能够利用在多个站点上重复使用密码的人。这是执行帐户接管 (ATO) 攻击的前兆,他们在其他站点上重复使用被盗密码来访问银行帐户或礼品卡,并窃取实际资金。

为了防止这种情况,专门构建的密码保护算法被设计为浪费时间。例如,PBKDF2 执行 SHA-256 之类的哈希算法数百次、数千次或数百万次,具体取决于您的配置方式。这大大增加了攻击者执行单个测试所需的工作量。如果您将 PBKDF2 设置为执行一百万次迭代,这将降低上述框的有效性,使每个帐户每秒仅测试 1600 万次密码猜测。与破解存储为单个 SHA-256 位哈希的数据库相比,攻击者只能测试数据库中百万分之一的密码。这就是降低风险。

除了约翰的出色回答之外,还有另一件重要的事情需要考虑。

检查密码时,会花费大量时间在数据库中查找存储的帐户信息(用户名、密码)等操作上。

如果您有一个快速散列算法,那么该查找现在会占用您密码验证的很大一部分。这使得入侵者进行攻击相对容易,他只需触发随机名称和密码,并通过计时响应来确定哪些名称而不是密码不存在。

通过在将传入密码发送到数据库以与存储的密码进行比较之前对其进行慢速散列处理,您可以将数据库查找和密码比较的持续时间从检查密码所需的时间中提取出来。结果是失败的查找现在与成功的查找花费相同的时间(在网络延迟等范围内)。

当然,这假设您在尝试检索用户信息之前对传入的密码进行哈希处理。如果您不这样做,则不存在的用户的失败将比密码错误的现有用户的失败要快得多,从而使攻击您的系统的人可能获得有关他所做的尝试包含哪些信息的潜在信息实际的用户名,即使他不知道这些是实际的用户名。

这在实践中会发生吗?不知道。但这是我们的渗透测试团队几年前告诉我们的哈希机制缓慢的原因之一。