我目前正在使用 .net/c# 创建登录和注册系统。一个 sql server 数据库保存用户名和密码(带有盐等的散列密码)
当我需要验证密码时,当前的程序是什么。是否将用户输入的值与盐等进行哈希处理,将其传递给存储过程并在那里进行比较?或者,与上述步骤相同,但比较 C# 代码中的密码?
我想根据最佳实践和最安全的方法做出决定,因此寻找关于这个和我应该考虑的项目的建议。
我目前正在使用 .net/c# 创建登录和注册系统。一个 sql server 数据库保存用户名和密码(带有盐等的散列密码)
当我需要验证密码时,当前的程序是什么。是否将用户输入的值与盐等进行哈希处理,将其传递给存储过程并在那里进行比较?或者,与上述步骤相同,但比较 C# 代码中的密码?
我想根据最佳实践和最安全的方法做出决定,因此寻找关于这个和我应该考虑的项目的建议。
我认为这是一个六和两个三分球。对我来说重要的是您存储的不是密码,而是哈希。这是很好的设计。
我唯一要补充的就是保持一致。当用户创建帐户或重置密码时,除了处理登录之外,您的哈希引擎也可能会发挥作用。将所有内容保存在一个黑匣子中。换句话说,数据库或 c# 中的一个应该非常智能,而另一个则非常愚蠢。
我想您可以从可重用性中获得它......您是否有可能希望在不同的数据库中重用安全机制?或者上面没有一层组件?这可能会影响你的选择。
我唯一能想到的另一件事是您在应用程序内更改数据时设置了什么安全性(即日常业务功能)。这方面会影响你的决定吗?
你应该用你最了解的来比较它。除非您绝对确定在密码错误时无法欺骗存储过程返回“True”,否则您最好在代码中进行比较。我建议你不要做类似“select * from users where login 〓 [value]”之类的事情
我宁愿这样做:
清理用户输入(即转义会导致 sql 错误或 sql 注入的不需要的字符)
准备一个参数化查询或存储过程,将用户和散列密码作为输入。
使 sp 返回每个匹配的行,以及两个字段(登录名和密码)
在代码中,检查 sp 返回一行且仅返回一行,并且登录名和密码都与用户输入匹配(避免一些 sql 注入)。
其中一些在某种程度上是多余的,但无论如何都会增加安全性。
无论哪种方式都可以,但我个人会在 C# 代码中进行比较。
我担心的是,如果有人可以访问数据库,即使哈希不匹配,他们也可以简单地更改验证存储过程以始终返回成功。但这实际上归结为您更信任的东西 - 您的应用程序代码安全性或数据库安全性。
我总是对用户名/电子邮件进行一般验证,然后使用它从数据库中提取密码并与用户在代码中输入的值进行比较......我是开发人员而不是 dba,这让我想到数据库支持代码(不是相反)所以当出现这种速度不受影响的情况时,我将逻辑推向代码..
不是真的对错..正是我会做的
编辑:始终加密/散列您的密码。