【发布时间】:2017-05-13 21:00:06
【问题描述】:
我创建了一个简单的 MVC4 应用并注册了一个用户。用户名和密码存储在名为:AspNetUsers 的表中。此表没有盐字段。
我理解的方式是当用户登录时;他们输入用户名和密码。然后将盐与输入的密码连接起来,并与数据库中的密码进行比较。这不正确吗?即
Hash(PasswordEntered) + Salt = Password in database = authenticated
Hash(PasswordEntered) + Salt <> Password in database = not authenticated
有一个字段叫做:aspnetusers.SecurityStamp,但是我的研究告诉我这不是 Salt。
更新
我刚刚读过斯科特·张伯伦。请看以下步骤:
1)用户在注册时输入:Hello123作为密码,Salt(随机生成)为:456,则输入PasswordHash的密码为:Hello123+456
2) 然后用户尝试登录并输入 Hello123(正确)作为密码。 salt(随机生成)为:567。因此将Hello123+456与Hello123+567进行比较,认证失败。
在这种情况下,用户输入了正确的密码并且未通过身份验证。我显然在这里遗漏了一些基本的东西。
【问题讨论】:
-
在我的 AspNetUsers 数据库中,有一个名为 [PasswordHash] 的苍蝇
-
@federico scamuzzi,谢谢。盐不是分开存放的吗?
-
不..我不认为
-
根据您的更新,您缺少一个步骤。写入数据库的值为
456+Hash(Hello123+456),当您去测试密码时,它会执行类似于Hash(UserEnteredPassword+SavedPassword.Substring(0,3)) == SavedPassword.Substring(3, SavedPassword.Length-3)的操作 -
@Scott Chamberlain,在您上面的评论中,我相信应该说:456+Hash(456+Hello123) 而不是:456+Hash(Hello123+456)。对吗?