我已经进行了用户注册,我在其中添加了用户密码并使用 SHA256 对其进行了哈希处理。 稍后,当用户需要登录我的系统时,我需要对他的密码进行加盐和哈希处理,所以我: 1.从数据库中检索盐“字符串” 2.将salt转换成bytes 3. 创建一个新的 byte[] = [inputPassword.length + salt.length] 4. 并对其进行哈希处理。
现在新散列比原始散列短...(使用相同的散列函数)
鉴于这些信息,您认为问题可能是什么...... 将盐作为 CHAR 存储在我的数据库中是错误的,如果是,我应该保存什么或如何保存?
注意:两个哈希值都是在字节级别进行比较的。 注:所有用户信息都以CHAR形式保存在数据库中password和salt
提前谢谢你
最佳答案
您可以从转换为 base 64 字符串的 Guid 生成盐,然后将其作为 char 保存在数据库中。我使用 nvarchar 通过 .NET 字符串最大化我的选项。
然后你可以实现类似这样的东西来生成原始密码哈希,并在用户登录时比较哈希:
public static byte[] GetHash(string password, string salt)
{
byte[] unhashedBytes = Encoding.Unicode.GetBytes(String.Concat(salt, password));
SHA256Managed sha256 = new SHA256Managed();
byte[] hashedBytes = sha256.ComputeHash(unhashedBytes);
return hashedBytes;
}
public static bool CompareHash(string attemptedPassword, byte[] hash, string salt)
{
string base64Hash = Convert.ToBase64String(hash);
string base64AttemptedHash = Convert.ToBase64String(GetHash(attemptedPassword, salt));
return base64Hash == base64AttemptedHash;
}
关于C#:在对用户进行身份验证时,将密码哈希与用户输入的不同大小进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8890902/