我创建了一个简单的 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/