Javascript 用于验证特定条件的密码的正则表达式

Javascript 用于验证特定条件的密码的正则表达式,javascript,regex,Javascript,Regex,我期待有一个符合以下标准的regx模式: 验证/要求该字段包含 混合情况 最小长度为10个字符 最大长度为16个字符 存在2个数字(最少) 存在2个α(最小值) 1个特殊字符(最小值) 允许的特价:!\* 其他特殊字符应被拒绝 所有字符必须是非连续的 没有重复,例如“alittle1A!”将无效,因为它有“tt” 任何帮助都将不胜感激 到目前为止,我已经开发了: var passwordPattern = /^(?=.*\d{2})(?=.*[a-z]{2,})(?=.*[A-Z]{2,})(?

我期待有一个符合以下标准的regx模式:

验证/要求该字段包含
混合情况
最小长度为10个字符
最大长度为16个字符
存在2个数字(最少)

存在2个α(最小值)

1个特殊字符(最小值)

允许的特价:
!\*

其他特殊字符应被拒绝

所有字符必须是非连续的

没有重复,例如“alittle1A!”将无效,因为它有“tt”

任何帮助都将不胜感激

到目前为止,我已经开发了:

var passwordPattern = /^(?=.*\d{2})(?=.*[a-z]{2,})(?=.*[A-Z]{2,})(?=.*[^a-zA-Z0-9]{2,})(!#.\*)\1?(?!\1).{10,16}$/;

这好像不管用

您可以使用此正则表达式:

/^(?=(\D*\d){2})(?=([^a-z]*[a-z]){2})(?=[^!#.*]*[!#.*])(?!.*?(.)\1)[a-z0-9!#.*]{10,16}$/i

您可以使用此正则表达式:

/^(?=(\D*\d){2})(?=([^a-z]*[a-z]){2})(?=[^!#.*]*[!#.*])(?!.*?(.)\1)[a-z0-9!#.*]{10,16}$/i

您不应该限制密码中允许的字符,除了最小长度之外。您无法强制用户选择安全密码。您所能做的就是确保您拥有一个安全的系统,该系统不会被单个受损的用户帐户削弱

  • 切勿传输未加密的明文密码
  • 永远不要存储明文密码
  • 在用户进行“我忘记了我的密码”歌舞表演时,切勿向用户发送其现有密码——重置密码并向其发送一次性使用密码(仍然存在风险),或使用令牌系统允许用户通过单击链接登录,并确保在登录时强制用户设置新密码
  • 如果您遵循这些规则,那么就没有理由不能使用特殊字符——哈希和盐渍密码无论如何都不会包含这些字符,因此即使是数据类型或字符集限制在这一点上也是无效的

    以下是一些相关的问题/答案,说明为什么您的建议没有帮助,实际上可能有害:

  • 小结:这样做完全是随意的,对安全性没有影响

  • 总结:这相当于程序员的懒惰,或者密码能否以安全的方式存储或正确处理的不确定性

  • ?

    摘要:限制长度可以限制哈希时间

  • 总结:懒惰的程序员

  • 摘要:密码限制非常烦人

  • 这里有一个建议--在此处测试一些符合您的限制的密码:

    完成此操作后,请将这些密码的“安全性”与以下几种密码进行比较:

    您可能还希望研究双因素身份验证(因为最终,即使是安全的密码系统也不是真正安全的):


    除了最小长度之外,您不应该限制密码中允许的字符。您无法强制用户选择安全密码。您所能做的就是确保您拥有一个安全的系统,该系统不会被单个受损的用户帐户削弱

  • 切勿传输未加密的明文密码
  • 永远不要存储明文密码
  • 在用户进行“我忘记了我的密码”歌舞表演时,切勿向用户发送其现有密码——重置密码并向其发送一次性使用密码(仍然存在风险),或使用令牌系统允许用户通过单击链接登录,并确保在登录时强制用户设置新密码
  • 如果您遵循这些规则,那么就没有理由不能使用特殊字符——哈希和盐渍密码无论如何都不会包含这些字符,因此即使是数据类型或字符集限制在这一点上也是无效的

    以下是一些相关的问题/答案,说明为什么您的建议没有帮助,实际上可能有害:

  • 小结:这样做完全是随意的,对安全性没有影响

  • 总结:这相当于程序员的懒惰,或者密码能否以安全的方式存储或正确处理的不确定性

  • ?

    摘要:限制长度可以限制哈希时间

  • 总结:懒惰的程序员

  • 摘要:密码限制非常烦人

  • 这里有一个建议--在此处测试一些符合您的限制的密码:

    完成此操作后,请将这些密码的“安全性”与以下几种密码进行比较:

    您可能还希望研究双因素身份验证(因为最终,即使是安全的密码系统也不是真正安全的):


    这种验证是否不会在后端发生?如果不是,它真的应该这样做。没有什么能阻止一些精通JS的用户提交表单并绕过您的验证。另外,您是否有特殊原因不能在密码中使用任何字符?无论如何,在将密码传递给服务器之前,您应该在客户端对密码进行哈希和盐析,否则您只会招致攻击。仅供参考:通过实施这些限制,密码的强度实际上被削弱了。还有……我为任何需要在这个系统中使用人工密码的人感到非常抱歉:(这里是你实施密码限制的唯一原因:@Adrian-最佳做法是在两个地方都这样做。后端这样做是出于安全原因(例如,正如你所说,黑客可以绕过JS验证)前端这样做是为了获得良好的用户体验……强迫用户坐着完成服务器请求并重新加载页面以进行您可以轻松(立即)完成的格式检查,这根本不是一种好的体验在前端。@talemyn-但是,对密码中包含的字符进行验证的唯一方法是以明文形式访问密码。在任何情况下,密码都不应通过任何连接以明文形式传输,即使是“安全的”一、密码在任何时候都不能以明文形式存储,也就是说,以防发生明文传输