在登录时比较盐和散列密码看起来没有正确的工作
问题描述:
我在用户注册时存储了密码和密码的哈希值...但在他们登录时,我用盐和散列用户给出的密码,会发生什么新的盐和新的哈希生成....在登录时比较盐和散列密码看起来没有正确的工作
string password = collection["Password"];
reg.PasswordSalt = CreateSalt(6);
reg.PasswordHash = CreatePasswordHash(password, reg.PasswordSalt);
这些陈述都注册和登录....注册期间
盐和散列是eVSJE84W
和18DE22FED8C378DB7716B0E4B6C0BA54167315A2
在登录期间它是4YDIeARH
和12E3C1F4F4CFE04EA973D7C65A09A78E2D80AAC7
.....任何建议....
public static string CreateSalt(int size)
{
//Generate a cryptographic random number.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
// Return a Base64 string representation of the random number.
return Convert.ToBase64String(buff);
}
public static string CreatePasswordHash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
string hashedPwd =
FormsAuthentication.HashPasswordForStoringInConfigFile(
saltAndPwd, "sha1");
return hashedPwd;
}
答
现在你生成在注册和登录不同的盐。您需要使用相同的盐进行散列,否则您将得到不同的散列。也就是说,您需要将salt和密码一起存储到数据库中,并在用户尝试稍后登录时重新使用它以散列。
步骤:
- 用户注册,并提供了一个明文密码
- 您生成一个新的随机盐并用它来散列明文
- 您的盐和散列存储到数据库
- 稍后,用户尝试通过提供新的纯文本密码进行登录。你取的哈希,并从数据库中盐
- 可以使用盐来散列明文
- 比较两个散列
@Darin截至现在我存储'PasswordSalt'和'PasswordHash'在我表....我应该从我的表中删除'PasswordHash'字段? – 2010-05-19 06:42:15
一点都不,你们都需要。 – 2010-05-19 06:44:14
不,你仍然需要这两个表......但是你需要实际*使用它们,以及以后,而不仅仅是哈希。使用salt,在散列过程中将其应用于用户提供的密码,然后将其与存储的散列进行比较。不要为每个登录生成一个盐,仅用于注册。 – Amber 2010-05-19 06:44:34