密码复杂性策略 - 他们的任何证据?

时间:2009-01-19 12:45:48

标签: security passwords

我不止一次被要求为我正在开发的软件实施密码选择规则。典型的建议包括:

  • 密码长度必须至少为 N 个字符;
  • 密码必须包含小写,大写和数字;
  • 不重复使用最后的 M 密码(或 P 天内使用的密码)。

等等。

有些事情总是让我知道如何对密码设置任何限制 - 通过限制可用密码,减少所有允许密码的空间大小。这不会使密码更容易猜测吗?

同样,通过让用户创建复杂且频繁更改的密码,将其写下来的诱惑力会增加,同时也会降低安全性。

是否存在密码限制规则使系统更安全的定量证据?

如果有,有什么“最安全”的密码限制策略可供使用?


编辑ÓlafurWaage好心地指出了一个Coding Horror article on dictionary attacks,其中有很多有用的分析,但令我印象深刻的是字典攻击可以大大减少(正如Jeff建议的那样)只需在验证失败后添加延迟。

考虑到这一点,有什么证据表明强制复杂密码更安全?

10 个答案:

答案 0 :(得分:5)

  

有些东西总是让我烦恼   对密码施加任何限制   虽然 - 通过限制可用   密码,你减少了的大小   所有允许密码的空间。   这不会使密码更容易   猜?

理论上,是的。在实践中,您不允许使用的“弱”密码代表所有可能密码的一小部分,这些密码在没有限制时经常被选中,并且哪些攻击者知道首先攻击。

  

同样,通过让用户创建   复杂,经常变化   密码,写的诱惑   他们下来增加,也减少   安全

正确。强迫用户每月更改密码是一个非常非常糟糕的想法,除非在极端高安全性的环境中,每个人都真正了解安全需求。

答案 1 :(得分:3)

这些规则肯定会有所帮助,因为它可以阻止愚蠢的用户使用像“mypassword”这样的密码,不幸的是这种密码经常发生。

实际上,您正在强迫用户使用一组非常大的潜在密码。您只使用小写字母排除所有密码的集合并不重要,因为剩下的集合仍然大了几个数量级。

但是我的大烦恼是我在主要网站上遇到过的密码限制,比如

  • 没有特殊字符
  • 最大长度

为什么有人会这样做? W.H.Y。????

答案 2 :(得分:2)

关于这一点的一个很好的解读是Jeff关于Dictionary Attacks.

的文章

答案 3 :(得分:2)

  1. 从不阻止用户做他们真正想要的事情,除非这样做有技术限制。
  2. 你可能会因为使用字典词或3个字符的密码或只使用数字等愚蠢的事情而唠叨用户,但请参阅上面的#1。
  3. 没有良好的技术理由只需要字母数字,或至少一个大写字母或至少一个数字;见上面的#1。
  4. 我忘了哪个网站有关于密码的建议:“选择一个很容易记住的密码,但其他人很难猜到。”但后来他们开始要求至少一个大写字母和一个数字。

    密码的问题在于它们无处不在,任何没有摄影记忆的人在没有写下来的情况下实际记住它们基本上是不可能的,因此如果有人获得对这个书面列表的访问,就会留下严重的安全漏洞 - 密码。

    我能够为自己管理这个问题的唯一方法就是分割我的大部分密码 - 我刚检查了我的清单,到目前为止我已经达到了130个! - 分为两部分,一部分在所有情况下都相同,另一部分是独特但简单的。 (对于像银行账户这样需要高安全性的网站,我违反了这条规则。)

    通过要求所有存在的多种类型字符定义的“复杂性”,它会强制人们为不同的网站制定不同的约定,这使得记住相关密码变得更加困难。

    我要确认限制允许密码字符集的网站的唯一原因是它需要在键盘上输入。如果您必须假设需要从多个国家/地区访问该帐户,则键盘可能并不总是支持用户家庭键盘上的相同字符。

    有一天我将不得不在这个主题上写博客。 :(

答案 4 :(得分:2)

我的旧限制定理:

由于密码的安全性足够接近,因此附在计算机或监视器上的便签的可能性接近一个。

答案 5 :(得分:1)

还有一个人可能会指出最近在Twitter发生的惨败,他们的一个管理员的密码被证明是“幸福”,这就是字典攻击。

答案 6 :(得分:1)

对于这样的问题,我问自己what Bruce Schneier would do - 链接的文章是关于如何选择难以猜测典型攻击的密码。

另请注意,如果在尝试失败后添加延迟,您可能还希望在成功尝试后添加延迟,否则延迟只是攻击失败的信号,应启动其他尝试。

答案 7 :(得分:0)

虽然这并没有直接回答你的问题,但我个人发现我遇到的最具争议性的规则是你不能重复使用之前使用的任何密码。在同一个地方工作多年后,每2/3个月不得不更改一次密码,使用我一年前选择的密码的能力似乎并不特别不安全或不安全。如果我过去使用过“安全”密码(包含大小写的字母数字),请务必在一年或两年的时间内重复使用(取决于您需要更改密码的频率),这对我来说似乎是可以接受的。这也意味着我不太可能使用“更容易”的密码,如果我想不出任何容易记住和难以猜测的东西,这可能会发生!

答案 8 :(得分:0)

首先请允许我说,最小长度,区分大小写和所需特殊字符等详细信息应取决于谁有权访问以及密码允许他们执行的操作。如果它是发射核导弹的代码,那么登录以播放你的付费在线版“愤怒的小鸟”应该比密码更严格。

但是我有一个区分大小写的特定牛肉。

首先,用户讨厌它。人脑认为" A = a"。当然,开发人员的大脑'通常不典型。 ;-)但开发人员也因案例敏感性而感到不便。

其次,CapsLock键很容易被误击。它位于Tab键和Shift键之间,但它应该高于Esc键。它的位置很久以前就是打字机的时代,它没有替代字体。在那些日子里有它是有用的。

所有密码都有风险......您可以通过易用性来平衡风险,是的,可用性很重要。

我的论点: 是的,对于给定的密码长度,区分大小写更安全。但除非有人让我这样做,否则我选择更长的密码长度。即使我们假设只允许使用字母和数字,每个添加的字符也会将可能的密码数乘以36。

在数学方面不如我懒惰的人可以告诉你组合数量的差异,例如最小8个字符的区分大小写的密码和12个字符不区分大小写的密码。我认为大多数用户更喜欢后者。

此外,并非所有应用都将用户名公开给其他人,因此黑客可能必须找到两个字段。

我也更喜欢在密码中留出空格,只要大部分密码都不是空格。

在我正在开发的项目中,我的管理界面允许管理员更改密码要求,这些要求适用于所有未来的密码。他还可以强制所有用户在下次登录后随时更新密码(以满足新要求)。我这样做是因为我觉得我的东西不需要区分大小写,但是管理员(可能是我为软件支付了费用)可能不同意,所以我让那个人决定。

我的银行卡密码只有四位数。由于它是唯一的数字,因此不区分大小写。哎呀,这是我的钱!如果你没有考虑其他任何事情,这听起来很不安全,不是因为黑客不得不偷我的卡来获取我的钱。 (并拍下他的照片。)

另一个优点:开发人员来到StackOverflow并反复他们在某篇文章中读到的严格规则。 "永远不要硬编码。" (好像这是可能的。)"所有查询都必须参数化" (如果用户不对查询做出贡献,则不会这样做。)等等。

请原谅这个咆哮。 ;-)我保证尊重不同意见。

答案 9 :(得分:0)

就个人问题而言,我个人倾向于给予密码“分数”。根据输入文本的特征,拒绝不符合分数的密码。

例如:

Contains Lower Case Letter +1

Contains different Lower Case Letter +1

Contains Upper Case Letter +1

Contains different Upper Case Letter +1

Contains Non-Alphanumeric character: +1

Contains different Non-Alphanumeric character: +1

Contains Number: +1

Contains Non Consecutive or repeated Second Number: +1 

Length less than 8: -10 

Length Greater than 12: +1

Contains Dictionary word: -4

然后只允许分数大于4的密码(并在用户通过javascript创建密码时提供用户反馈)