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

时间:2012-12-11 21:11:44

标签: c# security passwords asp.net-membership

我目前正在使用.net / c#创建登录和注册系统。一个sql server数据库包含用户名和密码(带有盐的哈希密码等)

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

我想根据最佳做法和最安全的方法做出决定,以便寻找有关此问题的建议以及我应该考虑的事项。

4 个答案:

答案 0 :(得分:1)

我认为这是六个和两个三分球。对我来说重要的是你不是存储密码,而是存储哈希。那是个好设计。

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

我想你可以从可重用性来解决这个问题....你是否有机会重新使用安全机制与不同的数据库?或者上面没有一层组件?这可能会影响你的选择。

我唯一能想到的是你在应用程序中改变数据的安全性(即日常业务功能)。这个方面可能会影响你的决定吗?

答案 1 :(得分:0)

无论哪种方式都可行,但我个人会用C#代码进行比较。

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

答案 2 :(得分:0)

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

不是对或错..就是我会做什么

编辑:始终加密/哈希密码。

答案 3 :(得分:0)

你应该用你最了解的东西来比较它。除非您完全确定在密码错误时无法欺骗存储过程返回“True”,否则您最好在代码中对它进行比较。我建议你不要做“选择*来自登录〓[值]的用户”

我宁愿这样做:

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

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

  • 让sp返回每个匹配的行,以及两个字段(登录和密码)

  • 在代码中,检查sp是否只返回一行,并且登录名和密码都与用户输入匹配(避免一些sql注入)。

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