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