【发布时间】:2020-12-27 15:24:59
【问题描述】:
我正在使用下面的代码来比较数据库中的密码。
using (var hmac = new HMACSHA512())
{
var computedHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
using (var hmac1 = new System.Security.Cryptography.HMACSHA512())
{
var computedHash1 = hmac1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
}
var computedSalt = hmac.Key;
for (int i = 0; i < computedHash.Length; i++)
{
if (computedHash[i] != passwordHash[i])
{
return false;
}
}
return true;
}
分析我发现,当我们创建一个HMACSHA512()的新对象时,它会创建一个新的计算哈希,因此来自数据库的密码无法匹配ComputedHash。
如上所示,“computedHash”和“computedHash1”对于同一个字符串是不同的。
【问题讨论】:
-
您为什么要发明自己的身份验证系统?您使用 HMACSHA512 的事实意味着您不应该这样做,它不是适合这项工作的工具。这是一种消息签名算法,而不是安全的密码散列算法。只需使用 Identity 进行帐户管理。
-
你永远不会给你的哈希器一个种子。这意味着它理论上永远不会以相同的方式对相同的字符串进行两次哈希处理。
-
@CodeCaster 是的,我同意,我只是在尝试。
标签: c# .net asp.net-core asp.net-core-mvc asp.net-core-webapi