首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密码的复杂性是否完全需要?

问密码的复杂性是否完全需要?
EN

Security用户
提问于 2013-10-07 09:43:47
回答 3查看 905关注 0票数 1

对于一个网站,我希望这是我能找到的最安全的密码存储方案,它可以归结为将一个盐和散列密码存储在一个联系人数据库中:

代码语言:javascript
复制
        Byte[] lPassword;
        var lRNG = new System.Security.Cryptography.RNGCryptoServiceProvider();
        var lSalt = new Byte[16];
        lRNG.GetBytes(lSalt);
        using (var lPDBGen = new Rfc2898DeriveBytes(Password, Salt, 1000)) {
            lPassword = lPDBGen.GetBytes(16);
        }
        ... Save lPassword and lSalt to the database ...

如果攻击者能够访问这些信息,他们基本上可以访问受保护的数据(我买不起单独的安全密码服务器)。

因此,使用这种方案是否有任何目的,要求任何形式的复杂性,用户选择密码,直至并包括一个空的密码?

EN

回答 3

Security用户

回答已采纳

发布于 2013-10-07 13:50:53

不幸的是,不能简单地要求密码的复杂性。

为了密码安全,您真正想要的是密码具有很高的熵;但是熵不是密码的属性。相反,熵限定了密码的选择方式。“高熵”意味着“密码可能是许多其他值”。

通常的“密码检查器”无法进入人类用户的大脑,因此它们无法真正猜测用户如何选择密码。类似地,“密码复杂性规则”不能确保强密码;它们只是试图将用户驱逐出他的舒适区域,以避免一些经典的弱密码生成方法。但在实践中,它们不起作用。随机性对人脑来说是很难的。人类不可能在大脑的隐私中做出真正随机的选择,相反,他们会做出机智的选择。而且,他们也不喜欢被迫做出伪随机的选择。当密码复杂性规则生效时,通常的结果是用户创建机智的解决方案,导致密码符合规则,但不是随机的;因此,弱密码。

一个典型的例子是复杂性规则规定密码必须至少有一个数字和至少一个标点符号:实际上,用户的反应是系统地添加"1!“任何他们想要的密码。因此,规则使密码更长,但不是更强。事实上,他们甚至使密码变弱,因为这种系统后缀在密码长度方面仍然可以算作两个字符。如果您的系统强制使用8个字符的最小密码长度,那么人们将需要选择8个字符的密码;但是如果他们附加了一个系统的两个字符后缀(攻击者知道这一点,因为攻击者是一个知道典型用户想法的聪明人),那么他们就可以使用密码长度规则,只需要6个实际的随机字符。在这种情况下,密码复杂性规则适得其反:它们诱使用户采取有损安全的行为,即较弱的密码。

唯一合理的“复杂性规则”是最小长度(通常是8个字符),因为虽然长密码不一定强,但非常短的密码总是弱的,因为没有足够的可能的6个字符密码。

所有这些都是为了解释用户选择的密码对于相当大一部分用户来说是脆弱的。这是不好的,但重点是“密码复杂性规则”并没有真正改善情况。

可以做的是:

  • 使用适当的密码散列功能。这就是您使用PBKDF2所做的事情(Rfc2898DeriveBytes实现PBKDF2)。盐类和迭代在某种程度上有助于处理低熵密码。不过,您可能希望增加迭代次数:您的服务器可能承受的迭代次数可能远远超过1000次,而且越高越好。
  • 试着让这个问题变得无效。必须使用密码散列,因为有时攻击者会获得(部分)服务器数据库的副本,其中包含所有哈希密码;尤其是SQL注入通常会导致这样的结果。然而,如果你阻止这种情况的话,那就好多了。密码哈希是必要的第二道防线,但这并不意味着第一道防线不重要。
  • 对于在线字典攻击,攻击者与您的服务器就每个密码猜测进行对话,请应用威慑:如果来自单个IP的登录请求太多,时间太短,则暂时禁止该IP。
  • 教育你的用户。让用户选择强密码的一个好方法是提供密码生成器。重要的是,生成器是可选的,否则用户会感到它是一个约束,并拒绝使用它。生成器可以依赖于实际的随机性(即计算机,它有RNGCryptoServiceProvider),从而满足一个合理的熵指标。我最喜欢的密码生成方法是"aa00aa00“模式(两个字母、两个数字、两个字母,然后是两个数字)。这样的密码相对容易记住和输入,并且仍然提供了超过32位的熵,只要您使用的PBKDF2具有足够高的迭代次数,这就足够了。
票数 4
EN

Security用户

发布于 2013-10-07 09:47:26

不管你的密码哈希算法有多强(嗯,这很重要。但不多),当密码是愚蠢的薄弱。

像password123或ilovehowmileycyrustwerks这样的常见密码将很快落入字典攻击手中。

票数 4
EN

Security用户

发布于 2013-10-09 22:16:14

汤姆对“教育你的用户”的回答是安全社区长期以来所说的一切。然而,它在实践中并没有取得很好的效果。原因是复杂的,但它归结为两个核心概念:一条链只有其最弱的一环那么强大,还有一个古老的笑话,即你的用户中有50%低于平均水平。

第一,链式类比。攻击者通常不关心他们入侵的是哪个ID。如果他们被给予10,000破解,只要他们有一个薄弱的密码,他们就加入了。并将其应用于低于平均水平的用户,这意味着如果您的用户中只有一个是马虎、粗心或糊涂的,攻击者就会加入。培训人员有助于减少暴露,但由于连锁类比,它无法阻止攻击。绝不能依靠它来阻止所有的攻击。

在这里,您需要用传统的深入防御安全策略来备份您的系统。您不能简单地在站点前面抛出一个密码框,然后保留所有其他内容,因为您应该接受一个或多个用户是粗心的或其他不可信的。

从“受信任”用户发起的攻击的角度来看,许多系统的安全性测试较少,并且存在各种允许权限提升的缺陷。当然,首先要解决这些问题。但是你仍然需要适当地保护你的后端系统。它是昂贵的,但如果你曾经看到一个笔试器在一个不安全的系统中穿行,你就会明白为什么所有的门都需要关闭。

在修补完所有系统之后,您仍然有“受信任的”用户的不安全性,以及您合法允许他做的事情。他能在凌晨3点从爱沙尼亚的IP地址轻松地把他的全部余额转移到开曼群岛的银行吗?也许这不是个好主意。也许你为普通的中等规模的交易添加了一个双因素认证步骤,比如短信或电子邮件之类的东西?也许你需要一位官员在批准转帐前与他联系?

票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/43447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档