密码哈希和验证不匹配
Password hash and verification don't match
我正在为 ASP.NET MVC 5 编写自定义表单身份验证(不,我不想使用 ASP.NET 身份)。我正在尝试使用随机生成的盐对我的密码进行哈希处理,然后使用 SHA512 对 salt+password
进行哈希处理。以下是我写的方法:
private static User SetPassword(User newUser, string password)
{
var rand = RNGCryptoServiceProvider.Create();
var saltBytes = new byte[128];
var passwordBytes = Encoding.UTF8.GetBytes(password);
rand.GetNonZeroBytes(saltBytes);
var passHash = SHA512Managed.Create().ComputeHash(saltBytes.Concat(passwordBytes).ToArray());
var hash = Encoding.UTF8.GetString(passHash);
var salt = Encoding.UTF8.GetString(saltBytes);
newUser.PasswordHash = hash;
newUser.Salt = salt;
return newUser;
}
private static bool ValidatePassword(User user, string passwordTry)
{
var actualPasswordBytes = Encoding.UTF8.GetBytes(user.PasswordHash);
var passwordTryBytes = Encoding.UTF8.GetBytes(passwordTry);
var saltBytes = Encoding.UTF8.GetBytes(user.Salt);
var passwordTryHashBytes = SHA512Managed.Create().ComputeHash(saltBytes.Concat(passwordTryBytes).ToArray());
if (passwordTryHashBytes == actualPasswordBytes)
{
return true;
}
return false;
}
如果我单步执行代码,注册 (SetPassword()
) 方法似乎可以成功运行。用户的记录使用 UTF-8 编码的密码哈希和盐来设置。
如果我逐步完成密码验证方法,一切似乎也运行正常。根据密码 try 检查用户的记录(盐和散列)。
问题是,当我使用密码注册然后尝试以该用户身份登录时,密码验证失败。我可能不明白其中一种密码学 类 是如何工作的...谁能解释为什么这不起作用?
以下代码总是会失败,因为两个对象没有指向同一个引用:
if (passwordTryHashBytes == actualPasswordBytes)
尝试使用 LINQ 的 SequenceEqual()
方法
passwordTryHashBytes.SequenceEqual(actualPasswordBytes)
我正在为 ASP.NET MVC 5 编写自定义表单身份验证(不,我不想使用 ASP.NET 身份)。我正在尝试使用随机生成的盐对我的密码进行哈希处理,然后使用 SHA512 对 salt+password
进行哈希处理。以下是我写的方法:
private static User SetPassword(User newUser, string password)
{
var rand = RNGCryptoServiceProvider.Create();
var saltBytes = new byte[128];
var passwordBytes = Encoding.UTF8.GetBytes(password);
rand.GetNonZeroBytes(saltBytes);
var passHash = SHA512Managed.Create().ComputeHash(saltBytes.Concat(passwordBytes).ToArray());
var hash = Encoding.UTF8.GetString(passHash);
var salt = Encoding.UTF8.GetString(saltBytes);
newUser.PasswordHash = hash;
newUser.Salt = salt;
return newUser;
}
private static bool ValidatePassword(User user, string passwordTry)
{
var actualPasswordBytes = Encoding.UTF8.GetBytes(user.PasswordHash);
var passwordTryBytes = Encoding.UTF8.GetBytes(passwordTry);
var saltBytes = Encoding.UTF8.GetBytes(user.Salt);
var passwordTryHashBytes = SHA512Managed.Create().ComputeHash(saltBytes.Concat(passwordTryBytes).ToArray());
if (passwordTryHashBytes == actualPasswordBytes)
{
return true;
}
return false;
}
如果我单步执行代码,注册 (SetPassword()
) 方法似乎可以成功运行。用户的记录使用 UTF-8 编码的密码哈希和盐来设置。
如果我逐步完成密码验证方法,一切似乎也运行正常。根据密码 try 检查用户的记录(盐和散列)。
问题是,当我使用密码注册然后尝试以该用户身份登录时,密码验证失败。我可能不明白其中一种密码学 类 是如何工作的...谁能解释为什么这不起作用?
以下代码总是会失败,因为两个对象没有指向同一个引用:
if (passwordTryHashBytes == actualPasswordBytes)
尝试使用 LINQ 的 SequenceEqual()
方法
passwordTryHashBytes.SequenceEqual(actualPasswordBytes)