在登录系统上工作 - 客户选择密码进行站点访问的点。
除了使用RegEx确保密码足够强大之外,通常在我们的系统上,将检查将在数据库中结束的所有数据以防止注入等,并且对所有字段强制执行合理限制的字符集。我真的不想要一个特别严格的密码字符集,因为我认为它对安全性的反模式有点太过控制。
然而,在密码的情况下,我会用盐水SHA-512对它进行散列,无论如何都会引发一些问题:
在限制客户可以在密码中使用的字符集方面是否有任何意义 - 即我是否暴露于注入之外的任何漏洞,我假设这些漏洞将被哈希彻底规避?
对于允许所有方法一定有负面影响 - 我可以想到这样一个事实,即将来无辜的组合现在可能变成一个危险的组合 - 这是一个真正的问题,是否有其他我可能错过了?
是否有任何必须拒绝的字符/字符串 - 他们是否会通过本机ASP.NET保护?
可能有点主观,但鉴于它是一个SHA-512哈希 - 是否有任何限制用户可以选择的密码的最大长度(在合理的参数范围内),假设密码是重要的大小/复杂性可能会发出警告,以确认他们确实想要设置它。
感谢您的帮助。
编辑:这是一个使用ADO.NET(而不是LINQ / EF)访问MSSQL2008数据库的ASP.NET Web应用程序。
答案 0 :(得分:3)
从非英语的角度来看 - 密码应该没有限制。
例如,为什么要限制日语使用者使用US-ASCII字符集?为什么法语使用者不应该使用重音字符?
鉴于您的哈希值已正确保留,因此没有技术理由限制它。
答案 1 :(得分:1)
没有理由担心SQL插入攻击,除非您实际以纯文本形式将密码插入数据库(Danger,Will Robertson,Danger!),即便如此,如果您对查询进行参数化,它也不会是问题。你应该允许[a-zA-Z0-9]加上一些特殊字符。可能唯一要限制的字符是'<'这将触发ASP.net验证警告。有许多有趣的工具可以在客户端进行密码复杂性检查。我喜欢this one。它在用户输入时为用户提供一些即时反馈。
答案 2 :(得分:1)
由于密码是经过哈希处理的,因此它将以十六进制格式存储在数据库中。因此,我认为没有必要限制允许的字符类型。如果我想在密码中使用中文字母,我应该可以这样做。如果我为Firefox安装了一个生成随机字节的扩展并将其用于我的密码,我应该可以这样做。这里的教训是不限制用户的密码。
另请注意,RegEx具有unicode支持,能够检测用户是否使用过任何语言的字母。当您验证密码的强度时,这可能会变得很方便。