使用散列密码进行身份验证时始终 return false
Always return false on authentication with hashed password
使用 sha256 和 salt 对密码进行哈希处理时,我的验证方法总是 return 错误。在调试时我注意到在 return 上它将前 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);
}
但它也return我是假的
假设您的密码是 "Hello" 并且您的姓名="test".
存储
您需要生成随机盐。比您可以将盐和纯密码 ("Hello") 与您的哈希函数一起使用。现在要将结果保存在您的数据库中,您必须 存储生成的盐和散列密码。
正在检查
从数据库加载加盐和散列密码。再次使用您的哈希函数与用户输入(您要检查的普通密码)和数据库中的盐。之后,您可以将结果与数据库中的散列密码进行比较。就是这样......
使用 sha256 和 salt 对密码进行哈希处理时,我的验证方法总是 return 错误。在调试时我注意到在 return 上它将前 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);
}
但它也return我是假的
假设您的密码是 "Hello" 并且您的姓名="test".
存储
您需要生成随机盐。比您可以将盐和纯密码 ("Hello") 与您的哈希函数一起使用。现在要将结果保存在您的数据库中,您必须 存储生成的盐和散列密码。
正在检查
从数据库加载加盐和散列密码。再次使用您的哈希函数与用户输入(您要检查的普通密码)和数据库中的盐。之后,您可以将结果与数据库中的散列密码进行比较。就是这样......