假设用户注册我的网站。不要求某些密码标准是“坏”的东西,因为它可以给潜在的黑客提供一个如何猜测密码的起点?
例如,如果我说密码必须至少为八个字符,有一个大写字母和两个数字,那么这不会给黑客太多提供有关我所有用户密码的信息吗?
最后,我的问题是,实施一个可以提供随机密码标准规则的应用程序是不是一个好主意,因此没有“全局”标准?
逻辑功能:
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编程我的网站,所以如果我这样做,这样做会不会有任何安全隐患?或者,这种方式通常是一个坏主意吗?如果是这样,为什么?
答案 0 :(得分:2)
好问题,但是需要特殊字符肯定会要求黑客在标准字典之外尝试更多组合,如果使用暴力破解密码,无论如何都不是一种有效的破解方法。 此外,作为额外的安全措施,您可以在给定数量(通常为3次)尝试后“锁定”帐户...
答案 1 :(得分:1)
这可能会被推翻,因为它是基于意见的,但这是一个很好的问题,所以无论如何我都会尝试回答它。
“这不会给黑客提供关于我所有用户密码的过多信息吗?”
这是事实,在应用字典攻击或其他破解手段时,它确实给黑客一些理由。但我确实认为应该有一些密码要求的理由。
例如,
密码必须至少包含6个字符,一个大写字母,一个数字和至少一个特殊字符。
我以前见过这个,而且完全矫枉过正。但是,没有任何要求,用户很容易将密码设置为极其简单的东西。没有要求,安全风险实际上大于涉及某些要求的风险。
一个更好的例子:
密码必须至少有一个大写字母和一个数字
一个好主意可能是你的随机要求建议,或者只需要一个数字,也许是一个大写字母。至少在这种情况下,比使用密码为“abc123”的人更安全。
另外需要注意的是,您拥有的要求越多,攻击者对密码的了解就越多,但破解密码所需的时间越长越长。在没有任何大写字母或数字的情况下执行字典攻击已经需要相当长的时间。使用可以位于密码中任何位置的数字,大写字母和特殊字符,即使您确实知道它需要什么,也很难破解。
答案 2 :(得分:1)
密码必须至少为八个字符,有一个大写和两个数字,不会给黑客提供有关我所有用户密码的过多信息吗?
让我们看看。忽略标点符号(因为除非被迫使用,否则很少有人费心将任何密码放入密码中),密码中通常会出现62个字符。当然,有些比其他更常见,因为大多数密码都不是随机生成的。
让我们比较一下,如果我们只说'#34;最少8个字符&#34;与我们做出额外限制时发生的情况相比。我们还假设最坏情况下的密码,只有最小密码。
如果允许任何字符组合,则可能的密码数为62**8
,即2.2 * 10**14
限制为一个大写和两个数字的可能密码的数量是(嗯,我在组合学上不是很好)超过62**5 * 26 * 100
,2.4 * 10**12
。
因此攻击者肯定有更多信息:密码的总空间小了99%。但它太小小吗?这种差异(2.4万亿与220万亿)之间的差异是否可能会使攻击者暴力破解密码而不会这样做呢?
可能不是。即使它有所不同,只需要9个字符而不是8个字符就可以获得大部分空间。因此,您不会增加了解用户所做操作并选择强密码的用户的风险。
我并不完全相信自己在密码中需要大写和数字是加强它们的最佳方式,但是如果它阻止用户使用字典单词,那么你就不会在攻击者的方式上设置了一些障碍。您已经从该空间中删除了最糟糕的密码,这意味着您(希望)已经制作了#34最容易猜到的密码&#34;在你的网站上至少有点难以破解。关于密码的这些简单限制,这就是你所希望做的所有事情。
你必须考虑一下你的威胁模型。例如,有一段时间,我不确定该时期是过去/现在还是未来,在此期间,2万亿入口彩虹表在计算上是可行的,但200万亿彩虹表是不可行的。我怀疑这个时期对于地球上最有能力的攻击者来说是过去的时期,对于普通的裂解者来说,这个时期在未来,但是无论什么时候发生,这个历史时代都是短暂的,因此你不要希望以您的网站的实际攻击者为目标,假设您的网站具有安全性。
现在,将不同的密码标准应用于不同的用户会更好吗?如果攻击者正在应用受益于较小密码空间的攻击,那么如果。但是,如果任何限制都很弱(&#34;超过五个字符并且有两个数字&#34;在您的示例列表中最弱),那么仍然会允许一些用户密码较弱的用户对每个人都有最严格的限制。
所以基本上没有,我不认为随机应用同等价值的几个标准之一,不会有任何显着的好处。它可能做的最好的事情是将所需攻击的大小乘以您选择的不同标准的数量。如果不同的规则产生完全不相交的密码空间,那么实际上它就不会那么好。
要求大写字母或数字几乎是鼓励用户选择非字典密码的心理技巧,也许是为了让用户思考他们正在做什么。如果它有效,那就太棒了,无论你是否对所有人适用同样的规则,它都会有效。与用户实际想到和使用的密码空间相比,允许密码的空间几乎无关紧要。
如果您想阻止用户选择弱密码,请确保您的限制(无论是否已应用)会阻止最常用的密码(http://gizmodo.com/5954372/the-25-most-popular-passwords-of-2012,https://xato.net/passwords/more-top-worst-passwords/)。这些肯定是任何蛮力攻击者都会尝试的第一个。其中许多包含数字。它无法判断它们是否包含大写字母,因为研究人员已将所有内容都降低了。
值得注意的是,根据研究人员的说法,91%的暴露密码落入前10k(不区分大小写)。因此,即使允许每个密码中包含一个大写字母,平均长度为6.3个字符,攻击者也可以在63k猜测中对91%的帐户进行暴力破解。如果你允许用户使用这些密码,如果你很幸运,那么在适当的僵尸网络的在线攻击中找到它就需要一天的时间。针对安全哈希和盐渍密码列表的离线攻击几秒钟。
摆脱那些最常见的密码是绝对必要的,使攻击者难以暴力破解。密码空间的确切大小远没那么重要。
答案 3 :(得分:1)
当你需要一个大写字母和一个数字(至少8个字符)时,你真的会说,“至少8个字符,但不是字典单词”,而不必在字典列表中实际检查他们的密码
以下是您最终使用的密码 - 您可以获得最常用的密码,其中包含大写字母和数字:
你基本上要求人们添加他们自己的额外随机盐,但它并不是随机的。
您最终还会收到人们无法记住的密码,或者他们在任何地方都使用相同的密码。
密码政策没问题。不幸的是,你必须设法保护人们免受自己的侵害。只需确保为人们提供一种安全的方式来重置他们忘记的密码,并设置代码来检测和防止暴力攻击。
答案 4 :(得分:0)
正如评论中所阐明的那样,问题的核心是:使用随机选择的一组密码限制比一个普遍的全局限制更好吗?
从技术上讲,是的,它更好,只是因为你在密码上施加了一些未知信息。
但这不是很有利。如果你有n
个集合,那么最多你将攻击者的工作量提高了n
,因为攻击者的最坏情况(开发人员的最佳情况)是他们必须为每个n
限制单独执行 工作。
对于案例n=3
,这并没有太大的改进。将必要的工作量乘以3相当于增加约1.6位的工作量。从大局来看,这是微不足道的。可以使用案例n=1
攻击的攻击者仍然可以使用n=3
攻击,甚至n=10
攻击,他们只需要更耐心一点。为了实现真正的安全性,您希望使用将工作因子增加至少10位(或n >= 1024
)的方案。
为了有效,密码限制应该强加以下条件:
提供的示例密码限制有重叠,不会强加任何有用的条件。 random_1
和random_2
中有一半是random_3
的子集。 random_1
和random_2
确实是不相交的(由于数字限制)这是好的。但关键问题是random_3
并没有偏离标准的“任何被允许的”关键空间,而其他人只有一点偏离。攻击者不会进行3种不同的攻击,他们只会发动标准攻击,就好像他们对限制一无所知,他们偶然会攻击这些示例所允许的一切。这些具体的例子实际上增加很少。基于简单小写+大写,小写+数字等组合的词典被广泛使用。
所有这一切,为攻击者的工作增加开销是非常好的主意。事实上,这是我们已经解决的问题:使用带有“work”参数的密码哈希函数。这样的哈希允许开发人员指定必须完成多少内部工作才能计算密码哈希值,从而允许开发人员选择攻击者必须按比例缩放的工作量。这是您提出的更正式和实用的版本,但它更具可扩展性,广泛支持和更简单。我推荐的两个流行的哈希值是bcrypt
(python example)和scrypt
。