在登录时比较盐和散列密码看起来没有正确的工作

问题描述:

我在用户注册时存储了密码和密码的哈希值...但在他们登录时,我用盐和散列用户给出的密码,会发生什么新的盐和新的哈希生成....在登录时比较盐和散列密码看起来没有正确的工作

string password = collection["Password"]; 
reg.PasswordSalt = CreateSalt(6); 
reg.PasswordHash = CreatePasswordHash(password, reg.PasswordSalt); 

这些陈述都注册和登录....注册期间

盐和散列是eVSJE84W18DE22FED8C378DB7716B0E4B6C0BA54167315A2

在登录期间它是4YDIeARH12E3C1F4F4CFE04EA973D7C65A09A78E2D80AAC7 .....任何建议....

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和密码一起存储到数据库中,并在用户尝试稍后登录时重新使用它以散列。

步骤:

  1. 用户注册,并提供了一个明文密码
  2. 您生成一个新的随机盐并用它来散列明文
  3. 您的盐和散列存储到数据库
  4. 稍后,用户尝试通过提供新的纯文本密码进行登录。你取的哈希,并从数据库中盐
  5. 可以使用盐来散列明文
  6. 比较两个散列
+0

@Darin截至现在我存储'PasswordSalt'和'PasswordHash'在我表....我应该从我的表中删除'PasswordHash'字段? – 2010-05-19 06:42:15

+0

一点都不,你们都需要。 – 2010-05-19 06:44:14

+2

不,你仍然需要这两个表......但是你需要实际*使用它们,以及以后,而不仅仅是哈希。使用salt,在散列过程中将其应用于用户提供的密码,然后将其与存储的散列进行比较。不要为每个登录生成一个盐,仅用于注册。 – Amber 2010-05-19 06:44:34