c# - ASP.NET Identity - 盐存储在哪里?

标签 c# asp.net

我创建了一个简单的 MVC4 应用程序并注册了一个用户。用户名和密码存储在名为:AspNetUsers 的表中。此表没有盐字段。

我的理解是,当用户登录时;他们输入用户名和密码。然后将盐与输入的密码连接起来,并与数据库中的密码进行比较。那不对吗?即

Hash(PasswordEntered) + Salt = Password in database = authenticated
Hash(PasswordEntered) + Salt <> Password in database = not authenticated

有一个名为:aspnetusers.SecurityStamp 的字段,但我的研究告诉我这不是 Salt。

更新

我刚刚读了 Scott Chamberlain。请参阅以下步骤:

1)用户在注册时输入:Hello123作为密码,Salt(随机生成)为:456,则在PasswordHash中输入的密码为:Hello123+456
2) 然后用户尝试登录并输入 Hello123(正确)作为密码。 salt(随机生成)为:567。因此将 Hello123+456 与 Hello123+567 进行比较,验证失败。

在这种情况下,用户输入了正确的密码并且未通过身份验证。我显然在这里遗漏了一些基本的东西。

最佳答案

你的模式不正确,正确的应该是

Hash(PasswordEntered + Salt)  = hash in database = authenticated
Hash(PasswordEntered + Salt)  <> hash in database = not authenticated

ASP.net 提供程序的工作方式是在密码字段中存储 Salt + Hash(PasswordEntered + Salt)。因此,当您去测试密码时,您只需使用盐中分隔符之前的部分并将其与分隔符之后的部分进行比较。

在您的更新中,您错误的部分是用户登录时没有随机生成的盐。它重新使用在注册时为用户随机生成的盐,该盐以纯文本形式存储在数据库并且没有散列。

关于c# - ASP.NET Identity - 盐存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41381333/

相关文章:

c# - 在 for/foreach 循环中声明相同的对象

c# - 为什么使用 64 位哈希而不是字符串时字典的内存消耗会增加?

c# excel 插入检查工作表是否存在

asp.net - updatepanel 内的文本框出现问题 - 未导致 OnTextChanged 事件

javascript - 在 ASP.Net MVC 5 中将 javascript 数组从 View 传递到 Controller

c# - 在 ASP.NET 中处理从多个 session 到数据库的多个插入

c# - 注册事件,为什么代码可以编译不报错?

asp.net - 在asp.net网站上动态加载用户控件(ascx)

c# - .NET 3.5 中的 URL 重写

c# - 如何从程序集中只公开一个特定的类?