我是 C# 新手,这是我在这里的第一个问题,所以我提前为任何失礼道歉。
语境:
当用户注册时,我调用 CreateSaltedHash() 方法并将用户从文本字段中输入的密码传递给它。此方法在将密码存储在我的用户表的密码列中之前对密码进行加盐和哈希处理。
问题:
当用户尝试登录时,我应该如何验证密码?
如果我再次调用 CreateSaltedHash() 方法,由于随机盐,它将不匹配。
我应该将盐存放在单独的列中吗?生成加盐哈希时是否应该使用分隔符?根据加盐和散列密码验证输入密码的最安全方法是什么?
代码: 这是我到目前为止所拥有的。
public class PasswordHash
{
public const int SALT_BYTES = 32;
/*
* Method to create a salted hash
*/
public static byte[] CreateSaltedHash(string password)
{
RNGCryptoServiceProvider randromNumberGenerator = new RNGCryptoServiceProvider();
byte[] salt = new byte[SALT_BYTES];
randromNumberGenerator.GetBytes(salt);
HashAlgorithm hashAlgorithm = new SHA256Managed();
byte[] passwordByteArray = Encoding.UTF8.GetBytes(password);
byte[] passwordAndSalt = new byte[passwordByteArray.Length + SALT_BYTES];
for (int i = 0; i < passwordByteArray.Length; i++)
{
passwordAndSalt[i] = passwordByteArray[i];
}
for (int i = 0; i < salt.Length; i++)
{
passwordAndSalt[passwordByteArray.Length + i] = salt[i];
}
return hashAlgorithm.ComputeHash(passwordAndSalt);
}
public static bool OkPassword(string password)
{
//This is where I want to validate the password before logging in.
}
}
调用 Register 类中的方法。
User user= new User();
user.password = PasswordHash.CreateSaltedHash(TextBoxUserPassword.Text);