使用登录系统 - 客户选择网站访问密码的地方。

除了使用正则表达式来确保密码足够强大之外,通常在我们的系统上,所有将进入数据库的数据都会经过注入等检查,并且在所有字段上强制执行合理限制的字符集。我真的不想要一个特别严格的密码字符集,因为我认为过度控制它有点违反安全模式。

然而,就密码而言,我将使用加盐 SHA-512 对其进行哈希处理以进行插入,这会引发一些问题:

  • 限制客户可以在密码中使用的字符集是否有任何意义 - 即,我是否会暴露于注入之外的任何漏洞,而我假设这些漏洞将通过散列完全规避?

  • 允许一切的方法肯定有负面影响 - 我可以想到这样一个事实:将来一个无辜的组合现在可能会变成一个危险的组合 - 这是一个真正的问题吗?还有其他我可能错过的吗?

  • 是否有任何必须拒绝的字符/字符串 - 它们无论如何都会通过本机 ASP.NET 保护吗?

  • 也许有点主观,但考虑到它是 SHA-512 哈希 - 假设密码大小/复杂性可能会提高,那么限制用户可以选择的密码最大长度(在合理的参数内)是否有任何意义?警告以确认他们确实想要设置它。

感谢您的帮助。

编辑:这是一个使用 ADO.NET(不是 LINQ/EF)访问 MSSQL2008 数据库的 ASP.NET Web 应用程序。

有帮助吗?

解决方案

没有什么理由担心 SQL 插入攻击,除非您实际上以纯文本形式将密码插入数据库(危险,Will Robertson,危险!),即使这样,如果您对查询进行参数化,也不会成为问题。您应该允许 [a-zA-Z0-9] 加上一些特殊字符。可能唯一要限制的字符是“<”,它将触发 ASP.net 验证警告。有许多有趣的工具可以在客户端进行密码复杂性检查。我喜欢 这个. 。它在用户打字时向他们提供一些即时反馈。

其他提示

从非英语的角度来看——密码不应该有任何限制。

例如,为什么限制说日语的人使用 US-ASCII 字符集?为什么说法语的人不应该使用重音字符?

鉴于您的哈希值已正确保存,因此没有技术原因对其进行限制。

由于密码经过哈希处理,因此将以十六进制十进制格式存储在数据库中。因此,我认为限制允许的字符类型没有意义。如果我想在密码中使用中文字母,我应该可以这样做。如果我安装了一个 Firefox 扩展,它可以生成随机字节并使用这些字节作为我的密码,我应该能够这样做。这里的教训是不要限制用户的密码。

另请注意,RegEx 具有 unicode 支持,能够检测用户是否使用了任何语言的字母。当您验证密码的强度时,这可能会很方便。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top