我应该拒绝明显糟糕的密码吗?

信息安全 密码 可用性
2021-08-20 22:28:21

更新:我下面的问题和疑虑归结为:“我应该拒绝明显糟糕的密码,如'hellomydarling'或'password'吗?我的猜测是肯定的,我想知道到什么程度。我正在使用密码强度估计器来协助接着就,随即。


在密码选择方面,我一直在研究可用性与安全性。我在这个 Stack Exchange 上发现了这个非常有趣的引用。

“以牺牲可用性为代价的安全是以牺牲安全为代价的” https://security.stackexchange.com/a/6116/39548

我的想法和问题源于此。我正在开发一个密码强度计的原型,它出现在新密码选择输入字段(底部的 JsFiddle)旁边。

我制定的政策是,如果我认为密码“无法使用”,则让我的验证器失败,并让“更好”的密码通过。

但是,我担心禁止“ teenagemutantninjaturtles ”但让“密码必须至少为 8 个字符”通过的效果。两者都是错误的密码,但我的原型确实只能很好地处理第一个。

此密码强度计基于 Dan Wheeler 的 zxcvbn “真实密码估计库”,可从https://github.com/lowe/zxcvbn获得,并在此处详细讨论:https ://tech.dropbox.com/2012/04/zxcvbn -现实密码强度估计/

我喜欢 zxcvbn 因为它实际上使用字典来帮助识别弱密码或差密码。但是,我认为纯文本密码短语过于宽容。例如,它的股票实施将为“teenagemutantninjaturtles”授予最高分(4/4)。

然而,Ars Technica 的 Dan Goodwin 指出,如果没有真正的随机性,密码短语并不能非常有效地阻止有动机的攻击者 ( http://arstechnica.com/security/2013/10/how-the-bible -and-youtube-are-fueling-the-next-frontier-of-password-cracking/2/)。

所以这就是为什么我试图通过查找与 zxcvbn 字典轻松匹配的密码并将它们简单地标记为“不可用”来支持密码强度计的行为。

供您参考,我们透露最小密码长度为 6(即使它们很烂),最大为 50 个字符。没有其他限制或要求。尽管我们确实提供了诸如这些示例之类的提示,但我们并未披露密码无法使用的确切原因(例如,它与字典单词匹配、或过于简单、或与模式匹配等) 。

以下是我的实际问题:

考虑到密码强度计很难从“差”密码中正确评估“好”密码,在考虑人类行为和安全性时......

  1. 甚至包括密码强度估计器是否值得?
  2. 是否值得尝试用更严格的规则来支持现有的图书馆?
  3. 当我禁止他们认为是个好主意的密码时,我是否只会让我的用户感到沮丧?(我担心这可能会导致他们放弃或将密码复制到他们的显示器等)。
  4. 如果这不是一个好主意,那么提醒用户和阻止最糟糕的密码的最佳方法是什么?

注意:我并不是想发明自己的安全协议。一旦我们通过 https 获得密码,我们就使用 bcrypt 以高成本/迭代来存储它。为了争论,让我们假设这是我剩下要解决的唯一安全问题(事实并非如此)。

我只是想鼓励我们的用户更好地使用密码。

JsFiddle:

我已经将我正在进行的工作复制到了一个 jsFiddle,我自己的更改在脚本部分中(并且 zxcvbn 是一个包含的资源)。

http://jsfiddle.net/wsKEy/1/

为了使密码强度计更有用,还做了很多评论和工作,这也是为什么会有计时器和其他东西的原因。

谢谢你的想法。

3个回答

甚至包括密码强度估计器是否值得?

强度计?不,因为很难告诉普通用户列出的“强度”是绝对最大可能的强度,并且无论仪表说什么,他们的密码都可能被熟练的对手轻易破解,同时仍然要求他们注意仪表。

已知弱密码警告?绝对地!如果您可以检测到密码很弱,那么它就是弱密码。您只是无法检测到密码是否强大,因为您的软件无法实时访问最新的破解字典、规则集和其他先进技术(马尔可夫链等)

是否值得尝试用更严格的规则来支持现有的图书馆?

是的!去看看Hashcat支持的规则类型,注意当你有明文用户密码时,很容易应用很多规则。

  • 您可以使用简单的 UPPER() 等效项和全大写字典来处理所有大写/小写规则 - 如果找到它,它就很弱。(杰奎琳)
  • 纯粹为了满足长度最小值而添加/添加数字是一种简单的模式匹配 - 如果最后/前 N 个字符是数字,并且剩余长度不够,那么它很弱。(里迪克123)
  • 从开头/结尾删除 N 个数字,将其大写,然后检查字典中的余数 (JacQueLine12)
  • 以上,但 N-1 个数字和/或符号 (#1JacQueLine)
  • 以上,但日期格式。(JacQueLine02121995)
  • 如果最后/前N-1个字符是数字,最后/第一个是符号,剩下的长度不够,就是弱。(!JacQueLine1)
  • 一次取出一个字符,看看它是否与字典匹配。(杰奎琳)
  • 结合其中的一些。
  • 扭转所有这些。

将字典单词作为子集进行模式匹配,即

正确马电池主食

  • 正确:第 1813 个最常用的英语单词,phpbb 上的第 16828 行,Ubuntu 美式英语 small 上的第 9871 行。
  • horse:第 1291 个最常用的英语单词,phpbb 上的第 14820 行(horses 在第 1723 行!),Ubuntu 美式英语 small 上的第 21607 行。
  • 电池:第 3226 个最常用的英文单词,phpbb 上的第 7775 行,Ubuntu 美式英语 small 上的第 3644 行。
  • 主食: 6个字符,全部小写,不在前5000个最常用的单词中。phpbb 上的第 40524 行(订书钉在第 3852 行!),Ubuntu 美式英语小版上的第 42634 行。

请注意,所有这些都是长度为 7 或更少的单词;Ubuntu的美国英语小词典中长度为7或更少的单词少于21,000个,21000^4〜= 1.9E17,对于非常简单的“组合攻击:4个单词,无分隔符,长度1-或多或少2^58- 7、出自这本小词典”。

当然,正确的horsebattery 将是一个非常弱的密码来对抗组合攻击 - 3226^3 ~= 3.3E10 ~= 2^35,使用前 3226 个最常见的英文单词。

获取一些更好的字典;不要试图将它们发送到客户端,托管它们和更复杂的规则服务器端。当然,给客户发送一个小的第一次通过,但你需要更多。Phpbb 是我所知道的最好的常用小词表,然后添加 rockyou。许多破解者从暴力破解小密码开始,然后是小词表和大规则集,然后是大词表——据我所知,最大的超过 30GB,几乎包括在给定流行论坛上发现的任何人破解的所有密码,加上许多其他大型词汇表。

为自己找到一个快乐的媒介——足够快、足够高性能、足够大并且有足够的“规则”来删掉破解软件的前几次快速通道——如果你真的使用了足够多的 bcrypt 迭代,那么只有小字典 + 大规则集和大字典+小规则集将是几年的实际攻击。

当我禁止他们认为是个好主意的密码时,我是否只会让我的用户感到沮丧?(我担心这可能会导致他们放弃或将密码复制到他们的显示器等)。

是的。当你说“密码”、“密码”、“P@$$w0rd”、“P@$$w0rd1”、“P@$$w0rd123”,甚至“P@$$w0rd123!”时 是错误的密码,你会惹恼他们。当您说“Jennifer2007”是一个错误密码时,他们会感到沮丧(也许 Jennifer 也会感到沮丧!)。尽你所能管理他们的挫败感,并简单地接受一些。就我个人而言,我会建议你明确一点——告诉他们他们的密码是已知破解词典中的一个单词加上两个数字,这是正常的破解规则!

你的目的是双重的。首先,您不希望系统中有弱密码。其次,你想教育用户什么是弱密码,这样他们就有了一些了解来减轻他们的挫败感。

作为教育的一部分,如果您不及格他们的密码,也许可以向他们展示您生成的一些替代方案,这些替代方案可以通过您自己的测试。

1) 完全随机的密码

2) 完全随机的密码翻译成泡泡或其他可发音的子集

3) 正确的horsebatterystaple 类型密码,但使用更长且不常见的单词。以Ubuntu美式英语疯狂词典为例,减去美式英语小词典中的所有单词,选出N个长度至少为7个字符的单词。这使您没有任何真正简短的单词,也没有最常用的单词。

4) 1、2 和/或 3 的混合。

然后,如果他们愿意,您的用户可以简单地选择您向他们展示的内容(当然,通过 HTTPS,您可以使用最好的密码套件)。

就个人而言,我也强烈建议提高你的长度限制;我会推荐大约 14 个,但对于大多数用户群来说,这太长了。至少尝试 12 甚至 10 个,这样一个完全随机的密码可能在最小长度和字符集下具有少量价值。

“密码强度计”不测量密码的绝对强度。它衡量的是“仪表”的设计者在没有上下文的情况下破解密码的速度有多快。“计量器”会按某种顺序尝试多个密码,强度度量就是实际密码在这个潜在密码列表中的距离。

从这个意义上说,“密码计”只能高估实力。如果仪表显示“31 位熵”,它的真正意思是“可以在 2 30次操作中打破它,所以它不能强于 31 位”。但是,密码可能要弱得多。上一段中真正重要的表达是“没有上下文”。这不是一个非常现实的假设。攻击者攻击密码是因为他对攻击密码感兴趣,这意味着他对密码保护的内容有一些概念。他还可能有密码所有者的一些信息(例如他的姓名、电子邮件地址...)。

例如,想象一下实际上有多少 Facebook 帐户密码是“F4ceb00k7823”:如果您的密码计不知道它正在评估用于 Facebook 的密码,那么它可能会错过密码的前 8 个字符对总数的贡献几乎没有熵。

获取一个密码计,看看你是否可以用一个“机智”(但弱)的密码来欺骗它。这很容易。很好玩 !例如,该演示将为“BarackObama”提供惊人的 39.218 位熵(破解时间为 13 个月!)。现在是一个强密码!(奇怪的是,“BillClinton”和“VladimirPutin”的评分要低得多。)更重要的是,普通用户也会玩这类游戏,并觉得它很有趣。那就是问题所在。一个密码表注定会有这样的失败案例。一些用户会使用密码表作为弱密码的借口。其他人会认为他们有一个强密码;虚假的安全感与自愿使用弱密码一样大。

密码计量器可用作幕后工具,收集用户“自然”选择的密码统计数据,以便您知道在安全意识培训期间应该说什么。但是,将工具提供给最终用户会带来麻烦:一些人会玩它,另一些人会觉得受到它的保护,总体安全级别会降低。

另一方面,“不少于 8 个字符”的政策是可以接受的,因为:

  1. 少于 8 个字符的密码不能被认为是强密码,因为它会落入最愚蠢的暴力攻击。
  2. 用户理解为什么短密码很弱,并且会配合。
  3. 找到不被“不少于 8 个字符”规则拒绝的密码绝对没有任何乐趣。

您提到创建密码表,但您似乎真的对禁止“不可用”密码感兴趣。与会面者相比,您最好使用一个简单的复选标记或红色 X 来指示它是否可以接受(对用户来说更简单)。如果他们的密码不符合您的复杂性,您可以考虑包括有关如何使其符合的建议。

我注意到 zxcvbn 使用模式列表计算密码的熵,这可能是“tenagemutantninjaturtles”通过的原因(它可能不包含在列表中)。您可以考虑调整熵计算。'tenagemutantninjaturtles' 中的实际熵非常少。该示例的字符范围非常有限,在传统的强度检查器上会失败(没有大写字母、数字、特殊字符)。只需修改为“TeenageMutantNinjaTurtles1!” 虽然会绕过大多数天真的检查器。您可以考虑在开头或结尾附近的字符上放置权重,使特殊字符/数字/大写仅计入所需数字的一部分。

另一种解决方案可能是通过 Wikipedia 运行密码。Wikipedia 搜索可以捕获简单句法搜索无法捕获的引用。