0

假设用户注册了我的网站。不需要某些密码标准是不是“坏”的事情,因为它可以为潜在的黑客提供如何猜测密码的起点?

例如,如果我说密码必须至少有八个字符,一个大写字母和两个数字,这是否会给黑客提供太多关于我所有用户密码的信息?

最终,我的问题是实现一个可以提供随机密码标准规则的应用程序是否是一个好主意,因此没有“全局”标准?

逻辑函数:

critera = {
    random_1: <password must be more than five characters and have two numbers>
    random_2: <password must be more than six characters, cannot use numbers>
    random_3: <password must be less than eleven characters and start with a captial>
}

<random loop for sending criteria.random_x to any random user signing up for an account>

我用 Python 对我的网站进行编程,所以如果我这样做,这样做会有任何安全风险吗?或者,这种方式一般来说是个坏主意吗?如果是这样,为什么?

4

5 回答 5

2

好问题,但是如果使用暴力破解密码,那么需要特殊字符肯定需要黑客尝试标准字典之外的更多组合,这无论如何都不是有效的破解方法。此外,作为一项额外的安全措施,您可以在尝试给定次数(通常为 3 次)后“锁定”帐户......

于 2013-10-20T22:48:21.660 回答
1

这可能会被否决,因为它是基于意见的,但这是一个很好的问题,所以无论如何我都会尝试回答它。

“这不会给黑客太多关于我所有用户密码的信息吗?”

这是真的,它确实为黑客提供了一些在应用字典攻击或其他破解手段时开始的理由。但是我确实认为应该有一些密码要求的理由。

例如,

密码必须至少为 6 个字符、一个大写字母、一个数字和至少一个特殊字符。

我以前真的见过这个,这完全是矫枉过正。但是,在没有任何要求的情况下,用户很容易将密码设置为非常简单的东西。没有要求,安全风险实际上比涉及一些要求的情况要大。

一个更好的例子:

密码必须至少有一个大写字母和一个数字

一个好主意是您的随机需求建议,或者只需要一个数字,也许是一个大写字母。至少在这种情况下,比使用密码“abc123”的人安全得多

另外需要注意的是,你的要求越多,攻击者对密码的了解就越多,但破解密码的难度和时间就越长。在没有任何大写字母或数字的情况下执行字典攻击已经花费了相当长的时间。数字、大写字母和特殊字符可能位于密码中的任何位置,即使您知道密码需要什么,也很难破解。

于 2013-10-20T22:47:33.373 回答
1

密码必须至少有八个字符,有一个大写和两个数字,这不会给黑客提供太多关于我所有用户密码的信息吗?

让我们来看看。忽略标点符号(因为没有多少人会费心在密码中输入任何符号,除非被迫这样做),密码中通常出现 62 个字符。当然,有些密码比其他密码更常见,因为大多数密码不是随机生成的。

让我们比较一下如果我们只说“最少 8 个字符”会发生什么,而如果我们做出额外的限制会发生什么。让我们也假设最坏情况下的密码,它只有最小值。

如果允许任何字符组合,则可能的密码数是62**8,即2.2 * 10**14

一个大写和两位数字限制的可能密码的数量是(嗯,我不擅长组合)超过62**5 * 26 * 100,即2.4 * 10**12.

所以攻击者肯定有更多的信息:密码的总空间减少了 99%。但是是不是太小了?这种规模差异(2.4 万亿与 220 万亿)是否会在攻击者暴力破解密码和不这样做之间产生差异?

可能不是。即使存在差异,您也可以通过要求 9 个字符而不是 8 个字符来恢复大部分空间。因此,您不会增加了解自己在做什么并选择强密码的用户的风险。

我并不完全相信自己在密码中要求大写和数字是加强密码的最佳方法,但如果它阻止用户使用字典单词,那么你就为攻击者设置了某种障碍。您已经从该空间中消除了最糟糕的密码,这意味着您(希望)在您的网站上制作了“最容易猜到的密码”,至少更难破解。这就是您希望通过这些简单的密码限制来做的所有事情。

您确实必须考虑一下您的威胁模型。例如,有一段时间,我不确定那段时间是过去/现在/未来,在此期间,2 万亿入口彩虹表在计算上是可行的,但 200 万亿彩虹表是不可行的。我怀疑这个时期对于地球上最有能力的攻击者来说是过去,而对于普通破解者来说是未来,但是每当它发生时,这个历史时期都是短暂的,因此你不想建立你的网站假设您的实际攻击者当前存在安全性。

现在,将不同的密码标准应用于不同的用户会更好吗?如果攻击者正在应用从较小的密码空间中受益的攻击,它会。但是,如果任何限制很弱(“超过五个字符和两个数字”是您的示例列表中最弱的),那么与您对所有人使用最强限制相比,仍然允许一些用户使用较弱的密码。

所以基本上不,我认为随机应用几个同等价值标准中的一个不会有任何显着的好处。它可能做的最好的事情就是将所需的攻击规模乘以您选择的不同标准的数量。那是如果不同的规则产生完全不相交的密码空间,那么实际上它不会那么好。

要求大写字母或数字几乎是一种心理技巧,可以鼓励您的用户选择非字典密码,并可能让用户思考一下他们​​在做什么。如果它有效,那就太好了,无论您是否将相同的规则应用于每个人,它都会有效。与您的用户实际想到和使用的密码空间相比,允许密码的空间几乎无关紧要。

如果您想阻止您的用户选择弱密码,请确保您的限制(无论它们如何应用)都会阻止最常用的密码(http://gizmodo.com/5954372/the-25-most-popular-passwords -of-2012https: //xato.net/passwords/more-top-worst-passwords/ )。这些肯定是任何暴力攻击者都会尝试的第一批。其中许多包含数字。无法判断它们是否包含大写字母,因为研究人员已将所有内容都小写了。

值得注意的是,根据研究人员的说法,91% 的公开密码落入前 10k 名(不区分大小写)。因此,即使每个密码中有一个大写字母,平均长度为 6.3 个字符,攻击者也可以在 63k 次猜测中暴力破解 91% 的帐户。如果您允许用户使用这些密码,如果幸运的话,在来自普通僵尸网络的在线攻击中需要大约一天的时间才能找到它。对安全散列和加盐密码列表的离线攻击几秒钟。

摆脱那些最常见的密码对于使攻击者难以暴力破解是绝对必要的。密码空间的确切大小远没有那么重要。

于 2013-10-20T23:18:41.533 回答
1

当您需要一个大写字母和一个数字(以及至少 8 个字符)时,您实际上是在说“至少 8 个字符,但不是字典单词”,而无需根据字典列表实际检查他们的密码。

不过,这就是你最终得到的密码——你得到了最常见的密码,其中混合了大写和数字:

  • 密码01
  • L3tM3In!
  • 詹妮弗01

您基本上是在要求人们添加自己的额外随机盐,但这并不是真正随机的。

您最终还会得到人们不记得的密码,或者他们在任何地方都使用相同的密码。

密码策略很好。不幸的是,您必须设法保护人们免受自己的伤害。只需确保您为人们提供了一种安全的方式来重置他们忘记的密码,并有适当的代码来检测和防止暴力攻击。

于 2013-10-21T00:50:07.930 回答
0

正如评论中阐明的那样,问题的核心是:使用一组随机选择的密码限制是否比一个普遍的全局限制更好?

从技术上讲,是的,它更好,仅仅是因为您在密码上强加了一些未知信息。

但这不是很有利。如果您有n集合,那么您最多将攻击者的工作增加了 1 倍n,因为攻击者的最坏情况(开发人员的最佳情况)是他们必须独立执行每个任务的工作n限制。

对于这种情况n=3,这并没有太大的改进。将必要的功乘以 3 相当于增加了大约 1.6 位的功。在大局中,这是微不足道的。可以用这种情况攻击的攻击者n=1仍然可以用 攻击n=3,甚至n=10,他们只需要多一点耐心。为了真正的安全,您希望使用将工作因子增加至少 10 位(或n >= 1024)的方案。

为了有效,密码限制应施加以下条件:

  • 互相排斥
  • 强制符合密码的密码不类似于标准集

提供的示例密码限制有重叠,不强加任何有用的条件。两者的一半random_1random_2将是 的子集random_3random_1并且random_2确实是不相交的(由于数字限制),这很好。但关键问题是,random_3它与标准的“什么都允许”密钥空间并没有太大的偏差,而其他的只有一点点偏差。攻击者不会进行 3 次不同的攻击,他们只会发起标准攻击,就好像他们对限制一无所知,并且他们会顺便攻击这些示例允许的所有内容。这些具体的例子实际上添加的很少。基于简单小写+大写、小写+数字等组合的字典被广泛使用。

综上所述,增加攻击者工作的开销是一个非常好的主意。事实上,这是一个我们已经解决的问题:使用带有“work”参数的密码哈希函数。这样的哈希允许开发人员指定必须完成多少内部工作才能计算密码哈希,从而允许开发人员选择攻击者必须扩展多少工作。这是您建议的更正式和实用的版本,但它更具可扩展性、广泛支持且更简单。我推荐的两个流行的此类哈希是bcryptpython 示例)和scrypt.

于 2013-10-21T16:57:02.860 回答