Keepass 推荐的密码复杂程度

信息安全 密码
2021-09-06 18:22:36

我想开始使用我容易记住的 Keepass 主密码。

让我们用这句话:I really hate blue mountains,让我们把它设为一个密码:ireallyhatebluemountains

这足以作为 Keepass 主密码吗?

我听说我们应该始终包含大写字母、数字和特殊字符,但如果这真的是一个要求?

4个回答

让我们首先明确什么应该是常识:密码管理器主密码是一个非常有价值的秘密。(这与您使用的密码管理器无关。)

这是出于一个相当简单的根本原因:这个密码,连同它保护的加密密码数据库,基本上允许完全访问您在该数据库中存储了凭据的每个帐户。

因此,您应该确保此密码具有相应的安全级别。传统上,这导致使用奇怪的密码方案,这些方案试图结合使密码易于记忆和安全的目标。以今天的计算资源,这不再是一个简单的密码就能实现的目标

相反,我喜欢推荐Diceware风格的密码短语。(Diceware 类似于XKCD 936中描述的方案,但更明确地说明了如何收集随机性。此外,在 Diceware 中,如果生成的单词序列有意义从语言上讲,您实际上应该重新开始。)在适当的 Diceware 中,您使用随机物理过程(投掷物理骰子)来收集随机性,然后通过查找单词列表中的数字将该随机性转换为单词。在 Diceware 的特定情况下,您使用五次普通六面骰子来生成大约 12.9 位 (log2(6^5) = log(6^5) / log(2) ~ 12.92481...位) 的随机性每个字。虽然出于物理原因,常规游戏骰子往往不是完全公平的(以相等的概率产生每个值),但如果您担心这一点,那么可以购买“赌场骰子完全公平;但是,该错误可能足够小,以至于一个额外的单词可以解释骰子公平性的任何合理降低,您可以通过进行合理的投掷次数并注意每个值出现的次数来轻松测试自己的特定骰子(其中完全公平的骰子和大量的投掷次数应该是投掷次数的 1/6,因为骰子是六面的)。

由于我们通常假设攻击者知道您如何生成密码或密码,但不知道确切的输入或最终结果,这意味着攻击者知道您使用 Diceware 方法和字典生成了它。他们甚至可能知道您的密码长度。

鉴于这些假设,我们实际上可以直接计算出 Diceware 密码短语的猜测难度:对于正确生成的 Diceware 密码短语,每个单词对应的安全性非常接近 12.9 位。对于使用普通游戏骰子生成的相当好的密码短语,这可能不太简单,因为所有值的概率都不同。

对于离线攻击是一种可行的攻击模式的高价值密码,例如密码管理器,我可能需要至少 90-100 位的安全性。使用 Diceware 的 100 位安全需要 8 个字。(100 / 12.9 ~ 7.752,向上取整。)由于 Diceware 单词的平均长度约为 4.2 个字符,并且您需要在它们之间使用分隔符(通常是空格),这意味着为您提供大约 100 位安全性的密码变为大约41 个字符长。(8 x 4.2 个字符,加上 7 个分隔符,等于 40.6。)

相比之下,这不到您的示例长度的两倍ireallyhatebluemountains(以 24 个字符计),但正如其他答案所说明的那样,在实践中要安全得多,而且也不难记住。您的示例密码基本上需要完全随机生成,以使其具有相似的安全性(100 / log2(26) ~ 21.3 个字符才能达到大约 100 位:log2(26^21.3) ~ 100.12)。

这完全取决于@Yuriko 链接中看到的,还取决于一个相关概念:基础

熵是一个来自热力学的概念。它基本上表示给定系统可达到的可能状态的数量。实际上,在计算机安全领域,它与存在的组合(“状态”)的数量有关,也就是说,在正确猜测之前必须尝试的可能密码的数量。

例如,获取您的 23 个字母的密码。仅使用 95 个 ASCII 可打印字符,攻击者最多需要尝试 2e45 个密码才能正确猜到它。这个值(2 后跟 45 个零)与我们正在讨论的熵直接相关。如果该值增加(例如,因为您在密码中添加了一个字符),则熵增加,这意味着您的密码变得更强。

这就是为什么您可以听到人们应该使用更长的密码,而不是难以记住的密码的确切原因。

基础

基的概念来自代数。无需赘述,基础表示可用于表示系统的构建块。实际上,这里的基础是您的密码构建块:可用的字母。

例如,我刚刚写了“95 个可打印的 ASCII 字符”。这是一个基础:要创建密码,您可以使用这 95 个字母中的字母。另一个基础可以是“26 个小写基本字母”或“52 个大写和小写基本字母”或“小写字母减去 'l' 和 'o' 以及所有数字的集合”。

基础可能更复杂:

您的密码必须由一系列现有单词组成。

或者

您的密码长度必须至少为 8 个字符。它必须由字母数字字符加上':'、“;”组成 或者 ”!”。它必须至少包含一个大写字母。

也可以表示为基础。

最小基础

最小基是可以用来表示攻击者想要猜测的密码的最小基。在我们的例子中,您的密码的最低基础是仅包含您的密码的集合。:)

然而,在真正的攻击的情况下,这正是我们想知道的。然而,攻击者会选择一个被认为足够大但又不会太大的基础,以避免昂贵的计算。

现在让我们假设攻击者使用“所有 26 个基本小写字符”来破解您的密码,最多需要 4e32(4 个后跟 32 个零)猜测才能确保获得您的密码。即使以每秒 10 亿个密码的测试速度,它仍然是相当安全的。

现在让我们假设攻击者使用基础“通用英语单词”(2000),那么它最多需要3e16次猜测,这可以在一年内完成。

这就是为什么有些人仍然建议通过在密码创建时强加规则来强制使用更大的最小基数的原因之一。这意味着,如果您使用的基础元素(字符、单词等)未包含在攻击者选择的基础中,他就无法猜出您的密码。这意味着唯一能够找到您的密码的攻击者需要使用更大的基础,这将需要更多的时间。

足够强的密码

现在我猜你明白熵和基之间的关系了:基越大,熵越大。否则,熵与:

(basis size)^(number of basis elements)

XKDC 漫画的全部意义在于了解增加基础大小是我们的大脑不擅长的事情:结果似乎更随机,但事实并非如此(而且通常更难记住)。

套用作者已经说过的话,取一个 8 个字符的密码:如果攻击者知道密码是由“26 个小写字母和 10 个数字”组成,那么尝试所有可能的组合将比他认为的要快 2000 倍其中可以有任何 ASCII 字符。

相比之下,只需在原始密码上多加 3 个字符,就已经比 8 个字符的 ASCII 密码慢了 20 倍。

随机性

大多数密码破解程序都包含统计分析器(或先前分析的结果)。这种代码的目的是使攻击者在最小的基础上适应人类的思想和习惯。

例如,大多数人在必要时将密码的第一个字母大写。这是很常见的,这是优先测试的。大多数使用单词作为基本元素的人倾向于创建句子。一些字母更可能后面跟着一些其他字母,等等。

为了避免这种情况并从您的密码中获得最大的熵(以及因此最强的密码),您需要随机性来击败所有这些统计攻击。

这是您当前的密码缺少的一件事。

我应该包括大写、数字等吗?

  • 如果这对您来说很容易,为什么不这样做:这会增加熵,并迫使使用更大的攻击基组,这是好事。
  • 如果这对您来说不容易,只需添加一个新词,您就会在计算时间上获得大致相同的效果。
  • 但是,您应该使密码更加随机。

几个警告:

  • 我一直在谈论“测试所有组合的时间”或“最多需要......”:这是统计领域。您有可能在第一次尝试、第二次尝试等时就猜对了。人们抛出的一些显着的值就像组合数的平方根(生日悖论应该在这里敲响警钟)。然而,这些对于像这样的定性讨论是无用的。
  • 我一直在谈论与熵“相关”的量:这些不是直接的熵,但它们更容易理解。

基本上百合子已经告诉你这个问题的答案了。

复杂的密码已经死了一段时间了。事实上,当一些服务强迫我使用一些复杂性时,我真的很生气,因为它只是无用的。您总是会忘记密码或使用非常相似的密码(这与重复使用相同的密码不同,更糟糕的是)。

所以底线是,最好使用简单但较长的密码而不是短而复杂的密码。如果您想增加一些复杂性,例如不使用小写字符,请将其中的一些大写,例如每个单词的开头 ( IReallyHateBlueMountains)、第一个和最后一个字符 ( IreallyhatebluemountainS) 或任何其他模式 ( ireallyHATEbluemountains)。

没有人能够使用任何破解工具猜出这些密码中的任何一个。

对于您的确切示例,“我真的很讨厌蓝山”:,这不是一个足够强大的密码。但可能不是你想的那样。

它与密码复杂程度无关,即它并不弱,因为它缺少大写字母、数字、特殊字符等。

它的弱点主要有两个原因:

  1. 它缺乏随机性。书面英语的不可预测性非常低。密码需要不可预测性才能强大。如果密码破解者正在尝试 5 个单词的短语,并且已经选择了前两个单词“I”和“really”,那么它可能会尝试的第 3 个单词是“hate”(或“love”, “不喜欢”、“喜欢”等)。获得不可预测性的最佳方法是从列表中随机选择单词,例如使用Diceware但是,如果您愿意,您仍然可以通过从名词列表中绘制第一个单词、从动​​词列表中绘制第二个单词等来形成一个半连贯的句子,以制作“Mad Lib”风格的密码。不幸的是,追踪由词性分隔的大量单词仍然需要付出很多努力。
  2. 它只用了五个字。即使假设你完全随机选择了你的单词(我怀疑,因为它是一个连贯的句子),5 个单词对于有意义的安全性是不够的(除非你从一个非常大的单词列表中提取)。如果你想打败现代密码破解技术,你需要一个好的密码至少6-7 个单词。如果您使用较小的字典来随机选择单词,则更多。例如,使用标准的 diceware 列表,6 个单词可能就足够了(7 或 8 个更好);但是如果你使用的NGSL有一半可能的单词,那么你肯定需要添加一个或三个单词。

由于您使用的是 KeePass,我不妨推荐WordSequencer插件来生成您的主密码。完全披露:我为这个插件的开发做出了贡献,所以我可能有点偏见。

同样重要的是:确保您的数据库设置有大量的密钥转换轮次,以使可能遇到您数据库的任何攻击者更难对付。默认值不是很安全。一个更强的值可以使一个平庸的密码“足够安全”,但默认值会导致相同的密码很快下降。