有一个长度为 9 的密码(加盐和散列)或有两个不同的密码,每个长度为 8(使用两种不同的盐加盐和散列)更安全?
哪种密码策略更安全:一个长度为 9 的密码与两个长度为 8 的密码?
正如 John Deters 所指出的,2x8 几乎可以肯定更糟——但原因需要稍微解释一下。
LANMAN 哈希有几个问题(将密码分成两半的经典案例,出错了):
由于密码往往是人为生成的并且有点短,如果单个密码只比前半部分长一点(比如 8 个字符),那么破解后半部分所需的时间会大大减少——甚至可能泄露密码。上半场很可能是
LANMAN 实在是太快了(攻击者可以尝试,每秒进行哈希运算)
LANMAN 以不幸的长度将密码一分为二 (7),这很容易完全耗尽(在现代 GPU 上更是如此)
但是,您的问题与 LANMAN 案例略有不同:
- 它没有说明 2x8 密码实际上是一个被分成两半的单个密码(它们可以独立生成,并且是随机的)
- 它明确指出两个密码的长度为 8(而不是说,一个长度为 8,另一个长度为 1,著名的 LANMAN 最坏情况)
- 除非你的盐非常小,否则构建彩虹表是不可行的——这是加盐的目的(不像 LANMAN 哈希,它完全没有加盐)
所以这是一个有趣的问题——通过查看相关数学可以在很大程度上得到答案。
让我们做一些假设:
- 9x1 和 8x2 方法都使用相同的盐长度和算法进行加盐和散列
对攻击者来说最坏的情况——密码是从可打印的 ASCII 字符集(95 个字符)中随机生成的,并带有相当长的盐。(如果密码是人为生成的,这个问题就不那么有趣了,因为在实践中,它们通常会在攻击者不得不诉诸暴力之前很久就陷入简单的攻击)
现代硬件和速度是公平的游戏
- 哈希算法可能对并行性友好,也可能不友好
鉴于以上所有情况,我大致期望:
- 1x9 散列将在 95^9 (6.302 × 10^17) 散列操作中 100% 耗尽(并行化可能很好也可能很差)。
- 2x8 散列将在 (95^8)x2 (1.326 × 10^16) 散列操作中联合 100% 耗尽(并且无论算法如何,只需通过在不同系统上破解每个散列即可轻松实现简单并行化- 但通常可以在单个系统上也可以非常有效地并行化,具体取决于算法)。
换句话说:
- 第 9 个字符增加了95 倍的工作量,并且可能难以并行化
- 两个 8 字符的密码只需要双倍的工作量,并且可以简单地并行化
另一种思考方式是,再添加一个字符与破解95 个八字符密码的工作大致相同!(如果这不直观,请从比较较小案例(如 1x1 与 1x2)的简单案例开始,直到您理解为止。)
因此,在所有其他条件相同的情况下,1x9 应该几乎总是优于 2x8。
实际上,这不仅是对并行化力量的简单说明,它还应该清楚地说明为什么允许更长的密码长度如此重要。上述模型中的每个额外字符都会为整个键空间增加 95 倍的工作量。因此,添加两个字符会增加 95^2 - 或9025 次- 工作。蛮力很快变得不可行,即使对于非常快速和无盐的哈希也是如此。
这将是一个很好的家庭作业问题。;)
从数学的角度出发...... (为了简化计算,我假设只有数字密码)
情况 A: 2 部分 8 位密码,'对第 1 部分的暴力攻击需要最多 10^8 个哈希,部分相同。总共需要最多 2*10^8 个哈希 '
情况 B: 1 部分 9 位密码,“蛮力攻击需要最大 10^9 哈希”
数学说B比 A 好
几句话
添加更多密码会增加部分数量相乘的蛮力(在这种情况下是 2倍)
添加更多位数会增加位数的强力(在这种情况下是 x10^1)
拆分密码几乎肯定会更糟。它允许创建一个八字符彩虹表。这意味着系统中的所有密码都将由 8 个字符组成。(这正是 NT LANMAN 密码被破坏的方式。)在您的情况下,它只需要两个彩虹表。
九字符密码系统没有这种明显的缺陷,这意味着如果您输入正确的 14 字符密码,它将被安全地存储为单个哈希值。
如果不知道您的威胁场景是什么,就不可能有有意义的答案。你想保护什么?您是否担心暴力破解或哈希破解?在第一种情况下,我们需要知道您的登录程序(例如,我是按顺序输入密码还是同时输入密码?)。此外,如果您的登录程序在数以千计或数百万次失败的登录尝试后没有将我锁定,则它已损坏。这不是密码强度的问题。
用户把事情写下来怎么样?肩冲浪?网络钓鱼?密码背后的模型是什么?
有两个密码的合法用途,例如一个读取访问密码和一个单独的更改启用密码。我怀疑您是否考虑到了这一点,因为您的 9 字母密码替代方案只是将其扔在那里以表明现实比仅基于长度的密码强度的学术问题更复杂。