C# 使用哈希密码进行身份验证时始终返回false
使用sha256和salt对密码进行哈希处理时,我的验证方法总是返回false。在调试时,我注意到在返回时,它会将前32位数组与64位数组进行比较。我不知道我哪里做错了C# 使用哈希密码进行身份验证时始终返回false,c#,security,hash,sha,C#,Security,Hash,Sha,使用sha256和salt对密码进行哈希处理时,我的验证方法总是返回false。在调试时,我注意到在返回时,它会将前32位数组与64位数组进行比较。我不知道我哪里做错了 public static byte[] Hash(string value, byte[] salt) { salt = new byte[64]; using (var rng = new RNGCryptoServiceProvider()) {
public static byte[] Hash(string value, byte[] salt)
{
salt = new byte[64];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(salt);
}
return Hash(Encoding.UTF8.GetBytes(value), salt);
}
public static byte[] Hash(byte[] value, byte[] salt)
{
var saltedValue = value.Concat(salt).ToArray();
return new SHA256Managed().ComputeHash(saltedValue);
}
public bool ConfirmPassword(string password)
{
var passwordSalt = new byte[64];
using (var context = new DbConnection())
{
context.Connection.Open();
context.SqlCommand.Connection = context.Connection;
context.SqlCommand.CommandText = "select salt from users where name='test'";
var reader = context.SqlCommand.ExecuteReader();
while (reader.Read())
{
passwordSalt = reader["salt"] as byte[];
}
}
var passwordHash = Hash(password, passwordSalt);
return passwordHash.SequenceEqual(passwordSalt);
}
更新
所以如果我做对了:
public bool ConfirmPassword(string password)
{
var userSalt = new byte[64];
var temp = new byte[64];
using (var context = new DbConnection())
{
context.Connection.Open();
context.SqlCommand.Connection = context.Connection;
context.SqlCommand.CommandText = "select password from users where name='test'";
var reader = context.SqlCommand.ExecuteReader();
while (reader.Read())
{
temp = reader["password"] as byte[];
}
}
var passwordHash = Hash(password, userSalt);
return passwordHash.SequenceEqual(temp);
}
但它也会返回false让我们假设您的密码是“Hello”和name=“test” 储存 你需要生成一个随机的盐。然后,您可以将salt和普通密码(“Hello”)与哈希函数一起使用。要立即将结果保存到数据库中,您必须存储生成的salt和哈希密码 检查
从数据库加载salt和hash密码。再次使用散列函数和用户输入(要检查的普通密码)以及数据库中的salt。之后,您可以将结果与数据库中的哈希密码进行比较。就这样…让我们假设您的密码是“Hello”和name=“test” 储存 你需要生成一个随机的盐。然后,您可以将salt和普通密码(“Hello”)与哈希函数一起使用。要立即将结果保存到数据库中,您必须存储生成的salt和哈希密码 检查
从数据库加载salt和hash密码。再次使用散列函数和用户输入(要检查的普通密码)以及数据库中的salt。之后,您可以将结果与数据库中的哈希密码进行比较。就这样…您将salt与哈希密码进行比较。这显然总是不同的。@MarkoJuvančič,我需要将数据库中的哈希密码与输入的哈希密码进行比较?您必须从数据库中获取ta哈希密码。您只读的“salt”值(稍后用作对新密码进行哈希运算的salt)在哪里设置userSalt?它是否与用于存储密码的函数相同?SHA256是一个安全的哈希函数,但它不是为密码验证而设计的。密码验证应该很慢,而SHA256很快。请阅读,其中有关于“修复”ASP.NET密码哈希的部分。该部分告诉您确切的操作方法。您可以将salt与哈希密码进行比较。这显然总是不同的。@MarkoJuvančič,我需要将数据库中的哈希密码与输入的哈希密码进行比较?您必须从数据库中获取ta哈希密码。您只读的“salt”值(稍后用作对新密码进行哈希运算的salt)在哪里设置userSalt?它是否与用于存储密码的函数相同?SHA256是一个安全的哈希函数,但它不是为密码验证而设计的。密码验证应该很慢,而SHA256很快。请阅读,其中有关于“修复”ASP.NET密码哈希的部分。那部分告诉你该做什么。