对使用“需要几个世纪才能破解”的密码感到困惑

信息安全 密码 密码管理 密码策略
2021-08-09 13:15:09

我说的是这个密码 -23##24$$25%%26以及由出现在模式中的特殊字符组成的类似密码,这些天用户经常使用。

在工作(金融公司)中,我正在创建一个不应该允许用户选择的错误密码列表,涉及某些循环或模式,并且上述类型表现出包含连续数字和特殊字符之间的特征(重复某些次,here两次)。

出于好奇,我在一个非常知名的网站(在其登录页面)上查看了这一点,它表示这需要几个世纪才能打破。

列表中的更多示例可能需要数年时间才能破解,但极易受到攻击:

1!2@3#4$5%6^ 2@3#4$5%6^7& a!b@c#d$e%f^

现在,我对列表感到困惑,我是否应该将这些特定类型的密码标记为易受攻击并禁止用户使用它们,即使它们需要很长时间才能破解?

注 1 - 我们正在考虑这些易受攻击的用户,因为许多用户(因此,有多个类似的密码)都遵循这一趋势来轻松记住事情。
注2 - 我们很困惑,因为安全人员都在增加熵,他们忽略的是数据库中类似哈希的有序性增加。关于
我们在哪里画线,定义允许哪个密码,人们之间产生了摩擦或不允许。

编辑:

  • 我正在谈论但不会命名的这个网站,我在该网站上测试了密码,几乎每个道德/不道德的黑客、Stack Exchange 上的几乎每个用户和许多大/小公司(因为他们使用它的服务)都知道.

  • 我们不以纯文本形式存储密码我们使用了一种不错的、非自制的散列算法。
    一个事件导致我们检查了我们的密码策略,我们在db-2另一台机器上创建了一个单独的数据库,其中我们存储了 simple_hashed_newly_created 用户的密码(没有盐,没有,只是 hashed_pa​​ssword),而不存储 who_created,when_created 详细信息。我们只在短时间内这样做。任何密码更改也都进入了这个数据库。同时,在我们的原始数据库中,有db-1secure_salted_pa​​sswords。
    我们也不断创建一个散列易受攻击的密码列表,遵循一种模式,当我们匹配&L时,我们被逗乐了——我们看到了多组相似的密码,具有某些模式。Ldb-2Ldb-2 后来从系统中删除。

  • db-2被保存在高度安全的机器上并且是安全的,这里不会透露确切的细节。我们知道,即使是气隙或电源插座也不安全。两者都db-2L摧毁。

  • 不用担心这里发布的密码,因为我们已经进行了小型实验,并且所有这些特定的用户组都已重置他们的密码(当然,新密码与旧密码不同)。这就是原因,我来这里发布了一些样本。
    而且,我之前也在这里评论过,我发布了一个来自生成器逻辑的密码示例,它创建了一个非常庞大的散列密码列表,它可能在也可能不在db-2. 同样,由于所有这些用户都有一个新密码,所以不用担心,一切都是安全的。

  • 因为我知道生成器的工作原理,所以我在一个网站上测试了几个密码样本,我们对允许或禁止哪些密码样本以及什么标准感到困惑。

非常感谢您的回答,接受我的感谢。根据回答,我们暂时推迟了对密码选择的任何限制。

4个回答

在线计算器的结果基于一组特定的假设,这些假设可能不适用于任何一种情况。没有任何基础可以信任计算器来提供有关攻击者可能如何选择破解密码的任何见解。

例如,如果我知道您使用了一种模式,以及该模式是什么,那么我会调整我的暴力破解以与该模式保持一致。在线计算器无法解释这一点。还有其他类似的因素需要考虑。“熵”就是要确保尽可能多的随机性。无论使用什么字符,一组模式的随机性都会大大降低。

所以,是的,如果这符合您的目标,请禁止这些明显的模式。

不过,我确实对您禁止这些密码的方法感到担忧。你可能打错了仗。

只是出于好奇,我在一个非常知名的网站(在其登录页面上)上检查了这一点,它表示这需要几个世纪才能打破。

这样的网站不能被视为福音。许多是毫无价值的,即使是好的结果也必须仔细解释。首先,作为一般规则,强度检查器可以最终告诉您密码很弱,但不能真正向您证明密码很强大——它无法找出错误的密码很可能会受到一些攻击仪表不建模。对于一些极端的例子,这篇Ars Technica文章描述了对一些令人印象深刻的长密码的成功破解攻击

几乎立即,大量曾经顽固的密码暴露了自己。其中包括:“我还能再见到你的脸吗?” (36 个字符)、“一开始就是这个词”(29 个字符)、“从创世纪到启示”(26 个)、“我什么都不记得”(24 个)、“thereisnofatebutwhatwemake”(26 个)、“givemelibertyorgivemedeath”(26 个) ) 和“日东月西” (25)。

另一件事是,仅仅因为一个仪表告诉你它判断密码强并不意味着所有这些仪表都这样做。例如,最好的zxcvbn检查器之一认为,如果密码散列很弱,则可以在 3 小时内通过离线攻击将其破解:

password:              23##24$$25%%26
guesses_log10:         14
score:                 4 / 4
function runtime (ms): 3
guess times:
100 / hour:            centuries  (throttled online attack)
10  / second:          centuries  (unthrottled online attack)
10k / second:          centuries  (offline attack, slow hash, many cores)
10B / second:          3 hours    (offline attack, fast hash, many cores)

match sequence:
'23##24$$25%%26'
pattern:               bruteforce
guesses_log10:         14

它估计 2 分钟1!2@3#4$5%6^和10B/秒的攻击(32@3#4$5%6^7&a!b@c#d$e%f^以 10k/秒),所以它认为那些更糟。(尽管它确实给所有这些密码打分 4/4。仪表建议您实际接受这些密码中的任何一个,因为它估计如果您的应用程序实施了慢速密码散列,它们很有可能抵抗攻击。但它的分析实际上证明了它们对您应该减轻的特定攻击很弱。)

请注意,zxcvbn 仅根据大多数用户如何选择密码的一般知识对攻击进行建模——它没有任何关于您组织的密码策略或实践如何允许对了解它们的人进行专门攻击的具体知识。永远记住,该工具可以告诉你密码很弱,但不能说它很强大——zxcvbn 估计要破解几个世纪Am i ever gonna see your face again?,而我们知道的Ars文章实际上已经在现实生活中被破解了。

现在,我对列表感到困惑,我是否应该将这些特定类型的密码标记为易受攻击并禁止用户使用它们,即使它们需要很长时间才能破解?

正如 zxcvbn 结果所示,您应该禁止这些密码的直觉实际上证明是有道理的。问题在于,您不太可能成功编译有限的同样易受攻击的密码列表,也不太可能成功编译攻击者可能成功利用的模式。例如,要捕获 zxcvbn 认为与后三个一样易受攻击的所有密码,您需要一个包含 1.2 万亿条目的列表(10B 密码/秒 × 2 分钟)。不实用。即使您尝试将事情浓缩为要拒绝的一小部分模式列表,我也不会指望成功超越您的攻击者。

您绝对应该做的一件事是使用强密码散列,以及 bcrypt 或 Argon2 密码散列函数。这就是上面 zxcvbn 结果所称的“慢散列”,它可能使您的密码条目更难破解。(但同样,请记住,强度检查器可以告诉您某些密码绝对不安全,但并不是说它是安全的。)

您还应该考虑的事项:

  • 使用一个小列表(数千个)已知非常常见的密码,并禁止使用这些密码。这样的列表很容易在网上找到。
  • 使用Troy Hunt 的 500M+ 泄露密码列表,它还有一个在线 API。(确保您阅读了有关 k-anonymity 的材料,因此您实际上不会向 API 发送密码!)
  • 使用像 zxcvbn 这样的智能强度计库,它是一种比您正在考虑的模式检测更复杂的替代方案。
  • 实施第二个身份验证因素,使密码不是您唯一的防线。

密码的可猜测性意味着了解人们可能选择的密码类型。我们都知道“密码”是可以猜测的,因为它是一个英文单词。但是要知道您需要了解英语,或者对英语或其他相关语言如何拼写单词有一个概念。来自参宿四附近某个地方的外星人从未接触过英语或其他人类语言,不会知道“密码”很容易猜到。换句话说,模式有些主观,这(超过一定水平)使得它们非常难以提前预测。

同样,对于您列表中的某些密码,模式是什么也不是很明显。1!2@3#4$5%6^ 乍一看有点“随机”,但您很快就会注意到,在 QWERTY 键盘上,它只是 1-6,并且每隔一个字符用 shift 键交替。

此外,如果有人向您展示密码 CPE1704TKS,您也可能会认为这是一个很好的密码。它有 10 个字母和数字字符,没有可确定的可重复模式,它不是任何人类语言中的单词。不过你错了,这不是一个很好的密码,因为它是电影 Wargames 结尾处用于发射核导弹的密码。

出于这个原因,使用随机网站的“可破解性”(基于长度和字符选择)的计算在很大程度上是虚假的。此外,它们依赖于获取密码哈希的人,这本身就是一个重大的安全隐患。它们是双重虚假的,因为它们暗示您知道哈希需要多快。根据您选择的算法,散列速度会有很多数量级的变化。因此,对“可裂性”分数持保留态度。如今,大多数对密码的攻击都使用通用密码,或者重用密码而不是窃取密码哈希。

实际上,这归结为简单地维护一个其他人多年来发现的具有某种特殊含义的“坏密码”列表。我的猜测是安全人员来自那里。

不可能证明给定的密码很难破解。

你所说的(正确的)声明这些“非常容易受到攻击”的意思是存在一种更容易猜测的算法来生成它们,即“以某种简单的模式击中 QWERTY 键盘的数字行”。这恰好是一个算法,对于一个整天按手指在这样的键盘上的人来说很容易识别,但是这样的键盘上的模式实际上是相当“计算机不明显的”,因为事实上大多数计算机程序都没有完全不关心按键的物理布局

我同样可以举一个例子YWJjZGVmZ2hpamts,你可能认为这是一个相当安全的密码,但你实际上是错的,因为它恰好是字符串的 Base64 编码,这对于使用字符串的 AI 来说abcdefghijkl似乎是完全显而易见的主要是位模式。

可以表达给定信息位的简单程度的概念称为Kolmogorov 复杂度尽管定义很简单,但这实际上是一个非常棘手的概念:它高度依赖于你想要表达一切的语言,而且它是不可计算的。实际上,您能做的最好的事情是使用大型标准库以富有表现力的编程语言评估所有可能的短程序,但如果这不成功它绝不保证没有低熵方法来计算密码另一种语言,包括一个关键的标准功能。如果您不知道 QWERTY 布局,您可能还会认为这asdfqwerzxcv是安全的,尽管当您知道它时完全显而易见。

结果:如果您确实找到给定密码的任何低熵表示,那么是的,禁止它。但是,如果任何人(包括任何程序)不知道密码是如何实际生成的,就不要从表面上接受任何人(包括任何程序)的断言,即给定密码是安全的。如果你想保证真正无法破解的密码,唯一的方法是确保它们来自量子力学物理随机过程。


任何涉及密码破解的程序都应该知道键盘布局,因为众所周知,人类倾向于诉诸这种模式。此外,即使23##24$$25%%26知道键盘布局也很容易,因为数字行几乎是按 ASCII 排序的。所以,这些网站在这里真的做得很糟糕。

这甚至忽略了运行时问题。您在这里所做的与暴力破解未知密码一样困难。