凭借强大的计算能力(例如您可以在亚马逊云中获得的),您可以为密码生成巨大的彩虹表。似乎还有一些您必须付费才能到达的大型彩虹桌。
秘密服务可能使用的最大表格是多少?密码最多可以有多少个字符?
我想知道当您自己选择新密码时应该考虑多长时间的密码? (这不是这里的问题!)
那些巨大的地下彩虹表(被邪恶势力使用)托管的最大密码长度是多少?
凭借强大的计算能力(例如您可以在亚马逊云中获得的),您可以为密码生成巨大的彩虹表。似乎还有一些您必须付费才能到达的大型彩虹桌。
秘密服务可能使用的最大表格是多少?密码最多可以有多少个字符?
我想知道当您自己选择新密码时应该考虑多长时间的密码? (这不是这里的问题!)
那些巨大的地下彩虹表(被邪恶势力使用)托管的最大密码长度是多少?
密码的长度和彩虹表的大小是红鲱鱼。大小不重要。重要的是熵。
彩虹表在这里并不重要,主要有两个原因:
建表是昂贵的。一张表“涵盖”了许多可能的密码;我们称之为N。有N个不同的密码将被打破。没有其他人会。碰巧的是,这N个密码中的每一个都必须在表构建期间进行散列处理。实际上,很多东西已经被哈希了好几次;构建一个可以破解N个密码的表大约需要 1.7* N次哈希调用。这比蛮力更昂贵。事实上,蛮力平均需要 0.5* N个哈希,因此建表成本是其三倍以上。
因此,彩虹表只有在可以被破解的四个不同密码哈希上至少应用四次时才值得努力。否则,这是一个很大的浪费时间。
彩虹表不能多次应用。那是因为盐。任何由比大猩猩拥有更多脑细胞的开发人员部署的密码哈希都使用盐,这是非重复变化参数。salts 的效果相当于为每个用户使用不同的哈希函数。由于必须为特定的哈希函数构建彩虹表,一次一个,因此彩虹表将只能破解一个密码哈希。结合上一点:彩虹表根本没用。
当然,现在有很多已部署的系统,其中密码没有以人类水平的能力进行哈希处理。Ape 驱动的开发导致许多服务器使用了简单的无盐哈希;甚至是密码存储为明文或一些易于可逆的自制编码的服务器。但是有人可能会说,如果你的密码要由这种设计草率的系统来管理,那么额外的密码熵将无法拯救你。一个完全无法应用健全的、记录在案的技术来保护密码(典型的敏感秘密数据)的软件系统在其任何其他组件中都不太可能表现得更好。软件设计中的粗鲁和疏忽就像蟑螂:当你看到一只时,你可以确定附近还有数百只。
现在让我们假设使用了合理的密码散列,结合了盐(以击败基于表的和并行攻击)和可配置的慢度(使散列更加昂贵)。例如bcrypt。这个答案是对密码应该如何散列的冗长说明。
例如,考虑使用 bcrypt 的服务器,配置为在该服务器上验证密码哈希需要 0.01 秒的 CPU 时间。这仍然允许服务器每秒处理 100 个用户登录,这是一个非常高的数字,因此服务器实际上不会将大量计算能力用于密码散列。
现在,想象一个攻击者得到了一些密码哈希,存储在服务器上(例如,他窃取了一个旧备份,或者使用 SQL 注入攻击来恢复部分数据库)。由于 bcrypt 是加盐的,攻击者将不得不为每个密码支付全部的暴力攻击成本;没有可能的并行成本分摊,特别是,没有预先计算的表(彩虹或非彩虹)将适用。
我们的攻击者很强大:他租用了一百台计算能力与被攻击服务器相似的服务器。这意味着每秒 10000 次密码尝试。此外,攻击者耐心而专注:他接受在一个密码上花费一个月的计算时间(因此该密码必须保护一些非常有价值的资产)。以每秒 10000 个密码的速度在一个月内,将尝试大约 260 亿个密码。
为了击败攻击者,因此选择具有足够熵的密码以在这些条件下将攻击者的成功概率降低到小于 1/2 就足够了。由于 260 亿接近2 34.6,这意味着密码熵至少应为35.6 位。
熵是用于生成密码的方法的一个特征,仅与长度松散相关。密码长度不代表强度;只需要长度来为熵腾出空间。例如,如果您将密码生成为一系列随机字母(大写和小写),那么 7 个字符会累积近 40 位熵,根据上面的计算,这应该没问题。但这绝对要求这些字母是随机的、统一的、彼此独立的。没有多少用户会努力使用计算机 PRNG 来生成新密码,然后接受在生成时学习它(我这样做,但是当我向我的同事解释时,他们用一种奇怪的眼光看着我大大地)。
正如这个著名的问题所暗示的那样,人类的记忆可能与熵不一致,而具有更多结构的更长密码可能是更好的权衡。考虑到“正确的马”方法以 25 个字母左右的“仅”44 位熵结束(顺便说一下,请注意,25 个字母的密码可能比 8 个字母的密码具有更少的熵)。但是,如果允许普通用户记住 40 位熵密码,那么额外的输入可能是值得的。
尽管有好莱坞电影的所有宣传,特勤局很少涉及极其先进的技术(就此而言,他们在干马提尼酒、长腿金发和摩托车追逐方面也很缺乏)。任何管理合理的特勤局都会避免花费 10k 美元来破解你的密码,因为 1k 美元足以雇佣两个暴徒来破解你的膝盖骨。归根结底,这都是相对成本的问题。
所以让我们开始实践吧。要生成密码,请在 Linux 系统上使用以下命令:
dd if=/dev/urandom bs=6 count=1 2> /dev/null | base64
这将输出由小写字母、大写字母、数字、“/”和“+”中的八个字符组成的密码。很容易证明,每个这样的密码都提供了高达 48 位的熵。重要的规则是:
至于最大预计算密码长度,没有。预计算的密码哈希是从字典中预计算的,而不是从键空间的顺序扫描中预计算的。虽然一些连续生成的非常短的密码可能很常见,但通常不会超过几个字符。存储 8 个字符密码的所有 256 位散列所需的空间为 EB 级;不超出技术能力,但肯定超出任何形式的成本效益考虑。
另外,如果存储密码的服务器对每个密码都使用盐,那么整个预计算的想法就会消失。完毕。没有彩虹桌。他们不再工作。盐渍哈希对彩虹表有抵抗力,如此处所述。
密码的长度完全无关紧要。所有这些都很重要——唯一重要的是,攻击者在猜测正确密码之前会尝试多少密码,每次猜测需要多长时间?
如果攻击者首先猜到了您的密码,那么再多的复杂性也救不了您,再多的服务器端存储复杂性也救不了您。攻击者登录和您登录一样容易。游戏结束。
如果您的密码在列表中,但从顶部向下 500,则攻击者获取您的密码所需的时间是每次尝试所需时间的 500 倍。如果每个密码需要 1 秒,那么您大约有 8 分钟。攻击者会在 5 分钟后放弃吗?如果他这样做了,那么你就安全了。如果他没有,那你就不是。
根据您的原始观点,如果您的密码在前 500 名列表中,那么预先计算的哈希值将可用。显然,这仅在密码未加盐存储时才重要。
如果您的密码是随机的,并且来自 48 位密钥空间(大约 8 个字符的字母数字),那么平均而言,攻击者将不得不尝试攻击者必须尝试 2 47 个密码才能获取您的密码。多久才能做到?如果使用 PBKDF2 存储密码,每次尝试调整为 ⅕ 秒(如 LUKS 使用的那样),那么猜测您的密码将需要不到 100 万年的时间。
另一方面,使用相同的密码,如果他拥有每秒尝试 500 万次猜测的硬件,那么您将缩短到不到一年的时间。50亿,不到一天。
我的建议是使用一个您不记得的随机、不可猜测的密码,而是存储在与浏览器集成的密码管理器中,如 KeepPass、LastPass 或 1Password。在这种情况下,6 到 24 个字符之间没有额外费用,因此您不妨选择一个较长的字符——比如 14 或 18 个字符。那应该绰绰有余了。
这里的关键是浏览器集成的密码管理器。猜测您的随机密码的攻击者不是您关心的攻击向量。这不会发生。相反,您关心网络钓鱼。这种情况发生的可能性要大得多,集成浏览器的密码管理器将为您节省.
假设 256 位(32 字节)散列并假设您想用 80 个不同的字符(26 个小写字母、26 个大写字母、10 个数字、18 个其他字符)覆盖所有可能的密码,这些是所需的彩虹表大小。我用公式计算了这个(80 ^ length ) * (32 + length)
。
但是,请记住,下表适用于80 个不同字符的所有可能组合。当您使用较少的字符或只为遵循某些模式的密码创建散列时(如字典中所有 l337speak 单词的排列),您最终会得到更少的空间。
Length Size Unit
1 2.5 KiloByte
2 212 KiloByte
3 17 MegaByte
4 1.3 GigaByte
5 112 GigaByte
6 9 TeraByte
7 744 TeraByte
8 59 PetaByte
9 4.7 ExaByte
10 391 ExaByte
11 31 ZettaByte
12 2.5 YottaByte
自己决定哪个数量级仍然在您考虑的攻击者的合理技术能力范围内。但是当你想要我的意见时,我认为:
我是http://passwordcreator.org/网站的作者。我建立这个网站是因为我想要一种更简单的方法来为自己生成安全密码。在为该站点进行研究时,我学到了很多关于安全密码的知识。
那里有分布式密码破解器,每秒可以进行 1000 亿次猜测。由政府赞助(大预算)的 NSA可能会做得更多。
为了在一年或更长时间内免受此类攻击,您的密码必须从数个 quintillion的可能性中随机选择。对于从大多数键盘上可用的 95 个字符随机构造的密码,这意味着您现在需要一个至少10 个字符长的密码才能获得良好的安全性。
如果您的密码是通过其他方式生成的(我的网站上有几种可用的算法),您的密码可能需要更长的时间才能达到同样的抗猜测能力。
在 10 个字符中,我几乎必须写下我的随机密码。如果您也是这种情况,我建议您将长度增加到至少 14 个字符,这样可以在更长的时间内保持安全。