我是一名新手,第一次在这里提问,如果有任何失礼之处,请您谅解。
背景:
当用户注册时,我会调用CreateSaltedHash()方法并传入来自文本字段的用户输入密码。此方法会对密码进行盐值加密后再将其存储在我的用户表的Password列中。
问题:
当用户尝试登录时,应该如何验证密码?
如果我再次调用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.
}
}
调用注册类中的方法。
User user= new User();
user.password = PasswordHash.CreateSaltedHash(TextBoxUserPassword.Text);