验证代码或存储过程中的密码



我目前正在创建一个使用.net/c#的登录和注册系统。sql 服务器数据库保存用户名和密码(带盐等的散列密码)

当我需要验证密码时,当前过程是什么。是获取用户输入的值与盐等进行哈希处理,将其传递给存储过程并在那里进行比较吗?或者,与上述步骤相同,但要比较 C# 代码中的密码?

我想根据最佳实践和最安全的方法做出决定,因此请寻找有关此建议和我应该考虑的项目。

我认为这是一个六和两个三。对我来说重要的是,您存储的不是密码,而是哈希值。这是很好的设计。

我唯一要补充的就是保持一致。据推测,除了处理登录之外,当用户创建帐户或重置密码时,您的哈希引擎也将发挥作用。把它全部放在一个黑匣子里。换句话说,其中一个数据库或 c# 应该非常智能,另一个应该非常愚蠢。

我想你可以从可重用性中得到它......您是否希望将安全机制与不同的数据库重用?还是上面没有一层组件?这可能会影响您的选择。

我唯一能想到的另一件事是您在更改应用程序内的数据(即日常业务功能)时采取什么安全措施。这方面会影响你的决定吗?

无论哪种方式都可以,但就个人而言,我会在 C# 代码中进行比较。

我担心的是,如果有人可以访问数据库,他们可以简单地更改验证 sproc 以始终返回成功,即使哈希不匹配。 但这实际上归结为您更信任的内容 - 您的应用程序代码安全性或数据库安全性。

你应该用你最了解的东西来比较它。除非您绝对确定在密码错误时无法诱使存储过程返回"True",否则您最好在代码中比较它。我建议您不要做类似"从登录〓[值]的用户中选择*"之类的事情

我宁愿做:

  • 清理用户输入(即转义可能导致 SQL 错误或 SQL 注入的不需要的字符)

  • 准备一个参数化查询或存储过程,将用户密码和哈希密码作为输入。

  • 使 sp 返回每个匹配的行,以及两个字段(登录名和 pasword)

  • 在代码中,检查 SP 是否返回了一行且仅返回一行,以及登录名和密码是否与用户输入匹配(避免某些 SQL 注入)。

其中一些在某种程度上是多余的,但无论如何都会增加安全性。

我总是对用户名/电子邮件进行一般验证,然后使用它从数据库中提取密码并与用户在代码中输入的值进行比较......我是一名开发人员而不是 dba,这让我认为数据库支持代码(而不是相反),所以当出现这样一种不影响速度的情况时,我会将逻辑推送到代码中。

不是真的对或错..只是我会做什么

编辑:始终加密/散列您的密码。

最新更新