“安全运营”的实践之道 ,到底要不要复杂密码? – 作者:langyajiekou

以最常见的网络安全问题弱密码这个话题而展开一下。

相信到目前为止,大部分企业所采用的一个最佳IT实践必定是采用复杂密码,不管是哪篇文章,哪本书籍,不管是CISSP还是CISP,要求用户使用强密码是必然存在的一个准则。而每次攻防演练中,用户弱密码或者缺省密码往往成为了攻击的最优解。

由弱口令导致的攻击事件实令人心惊胆战,弱密码,空密码,缺省密码以及明文密码等逐一被挖掘出来,涉及不乏有企业重要业务系统和核心基础设施的账号安全问题。为了解决这种问题,有些企业重刀下要求,要求员工使用12位甚至16位以上的密码,设定密码策略,必须符合大小写,数字,特殊符号齐全的强密码策略。我们今天就该问题进行一些讨论。

美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)发表了一篇文章,名为“Digital Identity Guidelines“挺有意思,大家有兴趣的可以去看看原文,地址后面附上,这篇文章讲了一些身份标识的使用准则,我这里简单给大家讲讲。

这些准则为实施数字身份服务的联邦机构提供技术要求,并不打算在此目的之外限制标准的制定或使用。这些准则的重点是对通过开放网络与政府系统进行互动的主体进行认证,确定某位申请者是先前已被认证的用户。

认证过程的结果可以由执行认证的系统在本地使用,也可以在联合身份系统的其他地方宣称。该文件定义了三个认证器保证级别中每个级别的技术要求。(AAL1,AAL2,AAL3,详情见文内表格)该出版物取代了NIST特别出版物(SP)800-63-2的相应部分。

1621242581_60a232d5711f7b12f5755.png!small

这篇文章噼里啪啦地讲了一大堆,我们主要看5.1.1.2 Memorized Secret Verifiers,中文不太好翻译,但意思应该容易理解,我直译了一下,密码验证器,文中指出几点:

密码长度需为8位以上,并允许最大长度为64位的可见字符(参考RFC20标准)

PIN码必须是6位以上

密码必须无任何“提示”信息,且不应提示任何特殊类型的信息,比如“你家的第一只宠物猫的名字是什么?”

在处理新增或变更密码请求时,将根据如下列表且不限于如下列表进行验证并排除该密码的变更请求

被列名的已知弱密码,比如qwerty

常见字典词,比如password等

重复的或连续的字符,比如aaaaaa,1234,abcd等

特定背景的词,比如服务的名称,用户名,以及其他衍生品

应向用户提供指导,如密码强度表,帮助用户选择一个容易记的强密码

应施行密码错误锁定策略

应允许使用粘贴选项,这是为了方便使用密码管理器进行密码粘贴,密码管理器在许多情况下增加了用户选择更强密码的可能性

应允许用户在输入密码的时候短暂显示每个输入的字符,以验证正确的输入,尤其适用于移动设备。一系列的点或星号输入经常导致密码输入错误,而在最后使用View查看输入的密码却又会带来其他风险

不应该对该密码强加其他组合规则(例如,要求不同字符类型的混合或禁止连续重复字符)

服务存储密码必须保证能对抗高强度的离线破解,必须采用适当的单向密钥加密函数并采用加盐散列提供,其中盐值必须为至少32位长度

请求密码时必须使用经过批准的加密和认证的受保护通道,以避免窃听和中间人攻击

使用多因素认证,并规定了软硬件单、多因素认证的标准

尽管从可用性和安全性的角度来看,密码的使用普遍令人沮丧,但它们仍然是一种广泛使用的身份验证形式。然而,在日常生活中,我们需要记忆的密码太多,线下的,线上的,社交的,企业的,各种各样的都需要密码,所以我们往往选择容易被猜中的密码,或者弱密码。

为了解决由此产生的安全问题,各种在线服务均已经出台了一些规则,以增加这些密码的复杂性。其中最值得注意的是密码组合规则,它要求用户选择使用混合字符类型(例如至少一个数字、大写字母和符号)构造的密码。然而,对被破解的密码数据库的分析显示,尽管对可用性和可记忆性的影响非常严重,但此类规则的好处并不像最初认为的那么重大。

用户选择密码的复杂性经常使用信息论中的熵概念来表征。虽然对于具有确定性分布函数的数据,熵值可以很容易地计算出来,但是对用户选择的密码的熵值进行估计是困难的,而且过去的努力并不是特别准确。出于这个原因,本文提出了一种不同的、稍微简单一些的方法,主要基于密码长度。

许多与使用密码相关的攻击不受密码复杂度和长度的影响。键盘记录器、网络钓鱼和社会工程攻击对冗长、复杂的密码和简单的密码同样有效。这些攻击不在本文讨论的范围之内。

长度

口令长度是描述口令强度的主要因素。太短的密码会导致暴力攻击以及使用单词和常用密码的字典攻击

所需的最小密码长度在很大程度上取决于所处理的威胁模型。通过限制允许的登录尝试的速率,可以减轻攻击者试图通过猜测密码登录的在线攻击。为了防止攻击者(或老打错字的)通过多次错误的猜测,轻易地对用户实施拒绝服务攻击,密码需要足够复杂,以便在多次错误尝试后不会出现速率限制,但确需要实施限制当发现有成功猜测的情况。

当攻击者通过数据库漏洞获得一个或多个散列密码时,有时可能发生离线攻击。攻击者确定一个或多个用户密码的能力取决于密码的存储方式。通常,密码是用一个随机值和散列处理的,最好使用一种计算代价昂贵的算法。即使有了这些措施,目前攻击者每秒计算数十亿哈希的能力,而且没有速率限制,这要求抵御此类离线攻击的密码比预计只能抵御在线攻击的密码要复杂几个数量级。

应该鼓励用户在合理范围内设置自己想要的密码长度。由于哈希密码的大小与它的长度无关,如果用户希望的话,没有理由不允许使用冗长的密码(或短语)。但过长的密码(长度可能为兆字节)可能需要过多的散列处理时间,因此有一些限制是合理的。

复杂度

如上所述,密码的组合规则通常用于试图增加猜测用户选择的密码的难度。然而,研究表明,用户以非常可预测的方式响应组合规则强加的需求。例如,一个用户可能选择了“password”作为他们的密码,如果要求包含大写字母和数字,那么相对来说,他可能会选择“Password1”,或者“Password1!”如果还需要一个符号的话,我想这点很多人都干过。

当用户创建的复杂密码的尝试被拒绝时,用户一般会说“靠,这都不行,真烦“?许多应用拒绝使用空格和各种特殊字符的密码。在某些情况下,不接受特殊字符可能是为了避免依赖于这些字符的SQL注入之类的攻击。但在任何情况下,正确散列的密码都不会完好无损地发送到数据库,因此这种预防措施是不必要的。用户还应该能够包括空格字符,以允许使用短语。然而,空格本身并没有增加密码的复杂性,而且可能引入可用性问题(例如,未被发现使用两个空格而不是一个),所以在验证之前删除输入的密码中重复的空格可能是有益的。

用户的密码选择非常容易预测,所以攻击者很可能猜测过去成功使用过的密码。这些密码包括字典中的单词和以前的密码,比如“Password1!”。出于这个原因,建议将用户选择的密码与不可接受的密码的“黑名单”进行比较。这个列表应该包括来自以前的入侵泄露过的密码、字典词汇和用户可能选择的特定词汇(如服务本身的名称)。由于用户对密码的选择也将受最小长度要求的约束,因此该字典只需要包含满足该要求的条目。

高度复杂的密码引入了一个新的潜在的弱点:太复杂,记不住。而且更有可能被以不安全的方式记录下来,比如写到纸上,或者用Excel记录。虽然这些做法不一定容易受到攻击,但从统计学上讲,一些记录此类秘密的方法将会受到攻击。反过来讲,这也是一个不需要太长或太复杂的密码的另外一种考虑。

随机PIN密码

文中还提到6位数的随机生成的PIN码已经足够强壮,可以作为密码使用的一个考虑。

总结

如果对密码的长度和复杂度要求超过了这里推荐的程度,将显著增加密码记忆的难度,并降低用户的易用性。因此,用户经常以适得其反的方式绕过这些限制。此外,其他的密码缓解措施,如黑名单、安全散列存储和速率限制,在防止现代暴力攻击方面更有效。因此,当密码验证框架完善,对该类密码而言,其实并不需要附加复杂性要求。

参考:

  1. NIST Special Publication 800-63B
  2. Password policy recommendations – Microsoft 365 admin | Microsoft Docs

来源:freebuf.com 2021-05-17 17:15:10 by: langyajiekou

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论