2016-12-29 70 views
1

我创建了一个简单的MVC4应用程序并注册了一个用户。 usrname和密码存储在名为AspNetUsers的表中。该表没有盐场。ASP.NET身份 - 盐在哪里存储?

我明白的方式是当用户登录时;他们输入用户名和密码。盐随后与输入的密码连接并与数据库中的密码进行比较。这是不正确的?即

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

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

更新

刚才我看到斯科特·张伯伦。请参阅以下步骤:

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

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

+0

在我的数据库中的AspNetUsers有一个名为[PasswordHash] –

+0

@federico scamuzzi,谢谢。但是,盐在哪里? – w0051977

+0

那里在taht领域有你的密码...盐渍 –

回答

2

你有不正确模式,正确的是

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

供应商对于ASP.net的工作原理是它存储在密码字段Salt + Hash(PasswordEntered + Salt)的方式。所以当你去测试一个密码时,你只需要在盐分离器之前使用该部分,并将其与分离器之后的部分进行比较。

+0

谢谢。在这种情况下,每个用户的Salt值必须相同(因为无法根据每个用户来确定它)。那是对的吗?用于修正公式的+1。 – w0051977

+0

不,对于一个有用的盐,每个哈希应该有一个独特的盐。用于盐的价值不是秘密信息,也不需要隐藏。请参阅[本答案](http://stackoverflow.com/a/21496255/80274)了解更多关于它如何存储的细节。 –

+0

不,盐与盐渍和散列密码一起存放在同一列 – phuzi