所以问题是:应该如何正确验证密码?
我们自己的Jeff Atwood(Coding Horror的博客作者,堆栈溢出和堆栈交换的联合创始人)在2017年3月写了一篇关于密码规则的博客,标题是密码规则是狗屁。如果你还没有读过这篇文章,我会敦促你这样做,因为它很大程度上反映了这篇文章的意图。
如果您从未听说过NIST(国家标准与技术研究所),那么您可能没有为您的项目使用正确的网络安全方法。在这种情况下,请看一下他们的数字身份指南。您还应该及时了解网络安全的最佳实践。NIST特别出版物800-63B(修订版3)提到了关于密码规则的以下内容:
验证者不应该为记忆的秘密强加其他的合成规则(例如要求不同字符类型的混合或禁止连续重复的字符)。
“您的密码长度必须介于8到30个字符之间,并且包含一个大写字母、一个符号和一个数字”(真的吗?)
如果为密码设置组合规则,会发生什么情况?您正在限制潜在密码的数量,并删除与规则不匹配的密码排列。这允许黑客确保他们的攻击做同样的!“是的,但这里就像是一个四万亿(1,000,000,000,000,000或1x1015)密码置换”:25-GPU集群在<6小时内破解每个标准Windows密码(958=6,634,204,312,890,625~6.6x1015密码)。
完全停止要求密码,让人们用谷歌、Facebook、Twitter、雅虎或任何其他你喜欢的有效形式的互联网驾照登录。最好的密码是你不必储存的密码。
来源:杰夫·阿特伍德的《你的密码太短了》
如果您真的必须创建自己的身份验证方法,至少要遵循经过验证的网络安全方法。以下两节(2.1和2.2)摘自当前的NIST出版物,第5.1.1.2节记忆的秘密验证器。
NIST规定您应该:
有太多的网站解释如何创建“正确的”密码验证表单:大多数这些都是过时的,不应该使用。
在继续阅读本节之前,请注意,本节的目的不是为您提供推出自己的安全方案所必需的工具,而是为您提供有关当前安全方法如何验证密码的信息。如果您正在考虑创建自己的安全方案,那么您真的应该三思而后行,阅读StackExchange安全社区的这篇文章。
在最基本的层次上,密码熵可以使用以下公式计算:
为这些额外的考虑添加逻辑是一个很大的挑战。有关可以添加到项目中的现有包,请参阅3.2。
在撰写本文时,现有最著名的用于估计密码强度的库是Dropbox的zxcvbn(GitHub上的一个开源项目)。它被改编为支持.netangularjscc#C++GoJavaJavaScriptObjective-cocamlphppythonrestrubyrustScala
然而,我明白每个人都有不同的要求,有时人们想以错误的方式做事。对于那些符合此标准的人(或者没有选择,并且已经向经理提交了本节以上的内容,但他们拒绝更新他们的方法),至少允许使用Unicode字符。当您将密码字符限制为一组特定字符时(即确保存在一个小写ASCII字符A-Z
或指定用户可以或不能输入!@#$%^&*()
),您只是自找麻烦!
下面的正则表达式模式并不适用所有编程语言,但在许多主要编程语言(java.netphpperlruby)中都适用。请注意,以下正则表达式在您的语言(甚至语言版本)中可能无法工作,您可能需要使用替代方法(即Python:参见Python正则表达式匹配Unicode属性)。一些编程语言甚至有更好的方法来检查这类事情(例如,使用mysql的密码验证插件),而不是重新发明轮子。如果按照Javascript+Unicode regexes中的讨论,使用XRegExp插件或其他用于Unicode类的转换工具,则使用node.js,以下内容是有效的。
如果需要防止输入控制字符,可以使用模式[^\p{C}\s]
在正则表达式匹配时提示用户。这将只匹配不是空白字符的控件字符-即水平制表符、换行符、垂直制表符。
以下正则表达式确保在8+字符长度的密码中至少存在一个小写、大写、数字和符号:
^(?=\P{Ll}*\p{Ll})(?=\P{Lu}*\p{Lu})(?=\P{N}*\p{N})(?=[\p{L}\p{N}]*[^\p{L}\p{N}])[\s\S]{8,}$
我正在尝试使用“新密码”解决方案来满足客户的要求。 我有这样的要求:< br> 1 -新密码必须是8 - 13个字符,< br> 2 -密码必须包含数字,< br> 3 -密码必须包含大小写字母,< br> 4 -密码不得包含用户名,最后< br> 5 -密码之前不得使用。 我不是Javascript方面的专家,我一直在尝试将所有这些要求放在一个脚本中,但我不知道如何解决这个要求的第1,4,5部分
问题内容: 我有一个看起来像这样: 到目前为止,我所有的验证都在模式中进行,我想知道如何通过密码验证来实现这一点。用户在两个字段中输入密码,并且模型应检查它们彼此是否相同。 这种验证是否属于架构?我是这种验证的新手。 我应该如何验证密码? 问题答案: 我最终发现,您可以结合使用 虚拟路径 和 函数来实现此目的(如本要点所示),以达到与密码匹配相同的目的: https //gist.github.c
问题内容: 因此,我必须创建验证密码是否有效的代码: 至少8个字符长 包含至少1个数字 包含至少1个大写字母 这是代码: 我不确定出什么问题,但是当我输入带有数字的密码时-它会一直告诉我我需要一个带有数字的密码。有什么办法吗? 问题答案: 您可以将模块用于正则表达式。 有了它,您的代码将如下所示:
主要内容:使用方式,实例演示jQuery Password Validation(密码验证)插件扩展了 jQuery Validate 插件,提供了两种组件: 一种评价密码的相关因素的功能:比如大小写字母的混合情况、字符(数字、特殊字符)的混合情况、长度、与用户名的相似度(可选的)。 一种使用评价功能显示密码强度的验证插件自定义方法。显示的文本可以被本地化。 您可以简单地自定义强度显示的外观、本地化消息显示,并集成到已有的表
我用哈希法通过了一个密码 这将密码作为哈希值存储到数据库中。但是当我试图通过 无论密码是否正确,它都会告诉我密码是正确的。有没有办法解决这个问题,所以我可以散列密码,但登录时输入(非散列)密码。
在我的登录PHP文件中,我有这些 在我的注册PHP文件中,我有这个。 现在,基本上我使它哈希密码,并插入自己的数据库注册。确实如此。 然而,它无法核实。这两个结果给出了两个不同的哈希,我不知道我可能做错了什么。我也试着让它再次散列输入并检查数据库中的password_hash,但那不起作用... 正确的使用方法是什么? (另外,$passSign和$userInput是输入字段,它确实获取用户名/