对密码长度保密有多重要?

信息安全 密码 蛮力
2021-09-07 01:07:04

将密码长度保密对安全至关重要吗?

知道您的密码长度为 17 的人是否会使密码更容易暴力破解?

4个回答

好吧,让我们从数学开始:如果我们假设您的密码由小写字母、大写字母和数字组成,则有 62 个字符可供选择(为了保持数学简单,真正的密码也使用符号)。长度为 1 的密码有 62 种可能性,长度为 2 的密码有 62^2 种可能性,...,长度为 n 的密码有 62^n 种可能性。

这意味着如果他们知道您的密码正好有 17 个字符,那么他们可以跳过所有长度小于 17 的密码,并且只有 62^17 个密码可以尝试。

但是与 62^17 相比,长度小于 17 的密码有多少?

好吧,如果我们将 62^n 相加并除以 62^17 我们得到(从 n=1 到 n=16 的 62^n 的总和)/62^17 = 0.016(链接到计算),所以只检查长度的密码17 比检查长度为 17 的所有密码快 1.6%

如果我们有一个允许所有 95 个可打印 ASCII 字符的密码方案,那么不必尝试使用短于 17 的密码所节省的费用将下降到1.06%链接到计算)。

关于长度小于 n 的密码数量与长度为 n 的密码数量之比的一个有趣的数学怪癖是,它实际上并不依赖于 n。这是因为我们已经非常接近 1/95 = 0.0105 的渐近线。因此,无论您的密码长度如何,攻击者都可以从这个技巧中获得相同的相对或百分比时间节省;它总是在 1% - 2% 之间。当然,您添加的每个新角色所花费的绝对时间都会增加几个数量级。


上面的数学假设一个简单的暴力破解器会尝试 a, b, c, ..., aa, ab, ... 这是破解正确随机计算机生成密码的好(ish)模型,但是用于猜测人为密码的糟糕模型。

真正的密码破解者是基于字典的,从英语词典中尝试单词(和单词组合)、泄露密码列表等,因此这些计算应该谨慎对待。

知道你的长度的另一个效果是他们不必尝试任何超过 17的密码,对于尝试组合字典单词的暴力破解算法来说,这实际上可以节省大量资金。


正如@SteveSether、@xeon 和@CountIblis 所提到的,公开密码的长度(或熵)也会影响攻击者是否甚至试图通过阻止他们远离强密码而将他们吸引到弱密码来破解您的密码。所以,如果你知道你有一个强密码,那就公开吧!但是,公开系统中所有用户的密码长度(或熵)具有使强密码更强、弱密码更弱的效果。


底线:

告诉别人你的密码长度并不是你能做的最糟糕的事情,但我仍然不会这样做。

除了@Mike 详述的数学之外,还要考虑密码长度到处泄漏:

  • 打字时,偷偷摸摸的旁观者可以通过计算屏幕上的“*”或听击键来学习它(在后一种情况下,他可以用智能手机记录声音并在闲暇时播放)。

  • 在经典的“Web 浏览器”场景中,用户名和密码将通过一些 HTTPS POST 发送到服务器。SSL 层会对数据进行加密,但 SSL 不会隐藏数据长度,因此被动网络观察者也会学习密码长度。

  • 用户侧接口和接收系统都将使用函数处理密码,这些函数的执行时间和内存访问模式将取决于密码长度。可以进行计时措施的攻击者通常能够从这些措施中推断出密码长度。

因此,明智的做法是将密码长度视为公共数据。一些攻击者将无权访问它(那种只获取服务器数据库副本的攻击者);其他人会知道的。很难知道密码长度“有多少秘密”,并且由于安全性就是量化事物,最好假设所有攻击者都可能知道密码长度。相信您可以对其保密,并根据该概念估计安全性,这将过于危险。

显示您的密码长度可以揭示您密码的强度。因此,您实质上是在向某人暗示猜测可能有多么困难。

因此,如果您的密码很长(在您的示例中为 17 个字符),那么它在很大程度上是无用的信息。如果密码很短(6 个字符),它会告诉攻击者您可能值得攻击。攻击者追逐最简单的目标。

我不同意接受的答案。如果所有密码都是由机器随机创建的,那么密码长度几乎是无用的。 如果密码是由人类以通常的方式创建的,则不再适用:基于一个或多个字典单词,混合大写小写,用数字或特殊字符替换某些字符,并添加前缀和后缀(例如“!1”) , 等等。

让我们看看 2 个场景,一个是我们有 10'000'000 个密码哈希,并且希望为这些哈希找到尽可能多的匹配密码。另一个是一个密码哈希,我们想破解它。在这两种情况下,差异都非常显着。像往常一样,所有信息都可能在攻击中被滥用,即使乍一看并非如此

场景 1:在资源有限的情况下破解 10'000'000 个密码哈希中的许多。

如果我们不知道密码长度,我们可以尝试对所有密码哈希进行暴力攻击,而无法区分它们。

如果我们使用详尽的蛮力攻击(保证找到密码),知道密码长度只会提供非常小的收益。为什么?暴力破解所有 7 位密码所需的时间大约是暴力破解所有 8 位数密码的 1-2%。通过知道长度我们获得的唯一好处是,如果我们已经知道密码有 8 位,我们不需要强制所有 7 位(和更小)的密码。除了蛮力攻击需要近乎无限的资源(计算能力和/或时间),因此不是我们可以或不会做的事情。

相反,我们为每个密码长度测试一系列“可能的”密码一种方法是使用字典攻击. 测试可能的密码比使用彻底的暴力破解便宜几个数量级,但它有一个巨大的缺点:一旦我们针对密码哈希尝试了所有“可能”的 7 位密码,但没有找到匹配的密码,我们就不会知道此密码哈希的匹配密码是否超过 7 位。因此,除非我们确定密码不超过 7 位,否则我们仍然必须针对所有“可能的”8 位密码、9 位密码、10 位密码等测试该密码哈希 - 并且在测试可能的密码时,就像穷举蛮力,测试更长密码的成本成倍增加。由于我们现在知道密码长度为 7 位,因此我们不必针对可能的 8、9、10、11、12 位甚至更长的密码进行测试,

它变得更好了。一旦我们测试了所有可能的密码长度(例如 20 位),我们现在可以将剩余的资源用于对那些密码长度较小的密码哈希进行暴力攻击,而我们之前搜索“可能”密码并没有破解这些密码长度. 假设我们还有 2'000'000 个未破解的密码哈希,其中 100'000 个的密码少于 6 位。请记住,我们的预算有限。破解 6 位密码的成本很低。但是因为我们知道哪个 100'000 是 6 位数或更小,所以我们现在需要暴力破解 100'000 个 6 位数密码才能破解 100'000,而不是暴力破解 2'000'000 密码破解 100'000 6数字密码。这是相同结果的 5% 的工作!

如果我们综合考虑所有好处,我们从知道密码长度中获得的确切收益取决于我们测试“可能”密码的方法的速度,我们测试每个密码长度的可能密码的方法的相应成功率,我们要破解的密码哈希集合中的密码长度分布,以及我们可用的资源量(计算速度、时间)。但是通过知道密码的长度,我们可以很容易地将我们在给定数量的资源下找到的密码数量增加几倍——如果这些数字对我们非常有利,我们可能会降低资源成本来破解 30% 的密码。密码数量级或更多。

场景 2:在有针对性的攻击中破解单个密码

在不知道密码长度的情况下,我们需要在暴力破解所有长度较短的密钥和测试可能的较长长度的密码之间分配资源。假设我们在每一个上花费了一半的资源,知道密码长度可以让我们完全传递 2 个中的一个,从而使我们的可用资源翻倍。

我们还获得了额外的信息,这些信息在有针对性的攻击中非常有价值:

  • 如果密码短到足以暴力破解,我们可以给出获取密码所需时间的上限。这可能会导致我们尝试一些我们甚至不会考虑的攻击。

  • 我们还可以计算破解密码的可能性。如果我们知道我们不太可能破解密码,我们可以将资源用于寻找其他方法来破坏系统。

  • 如果我们有来自同一用户的 2 个不同的密码,我们可以查看它们是否有可能实际上是相同的密码。如果它们仅相差 2-3 位数字,我们可以有根据地猜测较长的密码可能与较短的密码相同,加上前缀或后缀。

  • 如果我们获得有关密码的更多信息,则可能会获得比单独 2 条更多的收益例如,如果我们发现密码是牛津词典中的一个单词,如果我们每分钟只能暴力破解一个密码,您仍然有机会保护密码的安全。但是如果我们也知道密码长度是 17 位,那么游戏就结束了。