使用sha256和salt的散列密码,我的validate方法总是返回false。在进行调试时,我注意到它在返回时将前32个咬合阵列与64个比较。而且我不知道我在哪里犯了错误。
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);
}
但它也让我虚假
答案 0 :(得分:2)
让我们假设你的密码是"你好"你的名字="测试"。
您需要生成随机盐。你可以使用salt和普通密码(" Hello")和你的Hash函数。要立即将结果保存到数据库中,您必须存储生成的salt和哈希密码。
从数据库加载salt和哈希密码。再次使用Hash函数和用户输入(要检查的普通密码)和数据库中的salt。之后,您可以将结果与数据库中的哈希密码进行比较。就是这样......