使用 SHA-512 存储密码是否可以接受?

信息安全 密码
2021-08-28 15:27:59

我知道用于存储密码的最佳选择是 bcrypt/PBKDF2/scrypt。

但是,假设您必须审核一个系统并且它使用 SHA-512 和盐。那是“好”吗?或者它是一个必须解决的漏洞,即使您的网站是一个论坛?

当然,如果它很弱,则必须解决它,因为用户密码也可能在其他站点上使用。问题是 - 它是否太弱以至于不能容忍它作为一种可能性。

4个回答

不,你正在解决错误的问题。

从 SHA-1 或 SHA-256 迁移到 SHA-512 并不会使破解哈希变得更加困难。哈希通常不会通过算法的某些数学属性来反转,因此推进算法不会对安全性产生太大影响。

相反,哈希是使用“猜测和检查”技术进行暴力破解的你猜一个密码,计算哈希值,然后检查你是否猜对了。重复,重复,重复,直到你最终得到它。

所以减缓攻击者的方法是减缓散列过程。如果检查每个密码需要更长的时间,那么攻击者就无法猜出那么多密码。在这种情况下,SHA-512 并不明显慢于 SHA-256 或 SHA-1 或 MD5。所以你并没有真正增加任何安全性。

相反,bcrypt、PBKDF2 和 scrypt 等技术之间的共同点在于,它们都一遍又一遍地运行散列函数,仅仅为了一个密码猜测就运行了数千次。假设一个站点在 10,000 次迭代中使用 PBKDF2:这意味着攻击者必须在一次猜测上花费尽可能多的时间和资源,否则他将不得不花费在包含 10,000 个密码的整个字典上。通过减慢攻击者的速度,您可以限制他最终可以猜到的密码数量,从而降低他最终猜对的可能性。

许多安装调整其配置以适应现有硬件。因此,例如,LUKS使用最少 1000 次迭代,或者花费 1/8 秒的迭代次数,以较长者为准。

但是,假设您必须审核一个系统并且它使用 SHA-512 和盐。那是“好”吗?或者它是一个必须解决的漏洞,即使您的网站是一个论坛?

假设它是每个用户名的长密码随机盐,并且您的审计不必遵循任何特定的监管或法律规则,那么我建议进行一些数学运算。

这是一个讨论论坛,所以我认为用户永远不必更改密码。因此,基本问题是:

  • 平均而言,“普通”密码的安全时间应该是多久?
  • “正常”密码的假定键空间是什么?
  • 您希望攻击者能够以什么速率在离线攻击中尝试密码?

我们有基本方程:

  • 平均安全时间 * 2 = 密钥空间耗尽时间

我们使用以下有用的公式:

  • 密钥空间耗尽时间 * 测试率 = “正常”密码的最小密钥空间
  • “正常”密码的最小密钥空间/密钥空间耗尽时间 = 最大攻击率
  • “正常”密码的最小键空间 / 测试率 = 键空间耗尽时间

因此,如果我们举这个例子:

  • “普通”密码的平均安全期为 30 天
  • “普通”密码是 phpbb 泄漏词表(其中包含 184,389 个实际使用的密码)*“d3ad0ne”规则集(其中包含 35,408 条规则将一个字符串转换为另一个密码,例如在末尾添加 1,大写每个字母,首字母大写,末尾加 1,以此类推)。

我们有结果:

  • 30 * 2 * 24 * 3600 = 5184000 秒 keyspace 耗尽时间
  • 184389 * 35408 = 6528845712 个可能的密码(密钥空间)
  • 6528845712 / 5184000 = 1259 次尝试/秒是最大攻击率。
  • 这显然是不够的,因为OclHashcat列出的单台 PC 的速率为 7.97 亿次尝试/秒(8x AMD R9 290Xstock 核心时钟)。

如果我们走另一条路,我们有:

  • “普通”密码是 phpbb 泄漏词表 * “d3ad0ne”规则集
  • 测试速率为 7.97 亿次尝试/秒

因此,我们得到:

  • 184389 * 35408 = 6528845712 个可能的密码(密钥空间)
  • 797000000 次尝试/秒
  • 6528845712 / 797000000 = 8 秒。
  • 显然,使用一台现代计算机和这些密钥空间假设,您的“普通”用户将在 8 秒内被破解。

请注意,如果您有 1,000 个用户,则为:

  • 1000 * 8 = 8000 秒,或 8000/3600 = 2.2 小时平均破解 1000 个密码中的所有“正常”密码。

现在,如果您假设您的用户选择加密随机 8 个字符的密码,使用大写、小写和数字(祝您好运!):

  • 62^8 = 218340105584896 键空间
  • 797000000 次尝试/秒
  • 218340105584896 / 797000000 = 273952 秒
  • 273952 / 3600 = 76 小时。通常仍然不够,但很明显,如果您可以稍微增加最小长度(并保持完美的随机性和字符集),那么您就可以了。

首先选择有意义的数字,然后进行数学计算。之后答案就很明显了。您对散列“12345”所做的任何事情都无法确保其安全——您必须彻底禁止使用糟糕的密码。即使是单轮 SHA-512 也可以完全保护 128 个字符的加密随机密码。不过,大多数用户会选择更接近 12345 的东西。

词汇表

  • 安全天数:平均需要多少天才能破解给定的密码——在这个例子中,使用离线攻击和一台现代计算机。理想情况下,您希望这个值非常高,即使对于中等较差的密码也是如此。

  • 密钥空间:可能密钥的总数(密钥本质上是密码存储的任何形式 - 例如,SHA-512(密码)或 PBKDF2 值。对于这个例子,我们可以假设密钥空间 = 可能密码的总数。因此,如果密码只有 2 位数字和数字,则密钥空间为 20。如果密码只有小写字母且长度为 1 个字符,则密钥空间为 26。如果密码为小写字母 + 数字且长度为 3 个字符,则密钥空间为 (26 +10)^3。

  • 密钥空间耗尽时间:测试密钥空间中每个密钥所需的时间,即穷举攻击需要多长时间。如果您在键空间中有 2 个键,并且每个键需要 1 秒来测试/破解,那么您在 2 秒内就用尽了键空间。如果keyspace中有3600个key,测试/破解需要1秒,keyspace耗尽时间为1小时。任何一个密钥的平均破解时间是密钥空间耗尽时间的一半。

恐怕如果没有执行审计的组织的背景,就审计而言,这是否“很好”是不可能的。对一家公司来说很好的风险水平,对另一家公司来说可能完全不可接受。

就您问题的技术规格而言。假设您使用 SHA-512 和 per-user salt,根据您面临的威胁和违规的影响,这可能被认为很好。它绝对比无盐 MD5 好,但显然不如 bcrypt/PBKDF2/scrypt。

它会相对抵抗诸如彩虹表攻击之类的事情,但不会抵抗(如@terrychia 所说)对具有硬件辅助破解设施和花费时间的专用攻击者的抵抗力。

因此,这对您是否合适可能取决于您是否期望该级别的攻击者以该站点为目标,以及违规行为会产生何种程度的影响。

例如,如果一次违规行为会导致您损失 100 万美元的直接/间接损失,那么依赖被认为不太理想的设置似乎是个坏主意。

但是,如果违规将花费您 100 美元,那么开发人员实施修复所需的时间可能不值得。

不,这不好。

普通的 SHA512 可以使用 GPU/FPGA/ASIC 等东西以相当快的速度进行暴力破解。如果有可能修复它,请务必将其更改为使用 bcrypt、scrypt 或 pbkdf2 之类的东西。