HMAC SHA1使用相同的密钥和消息值
我正在研究一些C#安全代码,并且当我看到它正在使用HMACSHA1类时即将替换它。该代码用于散列密码以存储在数据库中。引起我注意的事情是,它使用密码作为HMAC密钥,这正是计算哈希的密码。那么是使用密钥和哈希的东西的数据好吗?这会使安全性变得更强还是更弱?HMAC SHA1使用相同的密钥和消息值
伪代码:
string pwd = "[email protected]#123$";
using (HMACSHA1 hasher = new HMACSHA1())
{
hasher.Key = encoding.GetBytes(pwd); // using password for the key
return BytesToHex(hasher.ComputeHash(encoding.GetBytes(pwd))); // computing the hash for the password
}
它是关于与两次迭代的无盐SHA1哈希强。即非常弱。
缺乏盐可以让攻击创建彩虹表,或者只是同时攻击数据库中的所有密码哈希。
由于攻击者可以简单地尝试更多的密码候选项,因此低迭代次数使得攻击速度更快。
您应该添加一个salt,并使用较慢的哈希方法,例如PBKDF2和bcrypt。 .net类Rfc2898DeriveBytes实现了PBKDF2,所以我推荐使用那个。
我不会推荐HMACSHA1用于数据库密码存储,但将密钥设置为与密码相同确实会削弱密钥在此目的中的用处。密钥应该是秘密的,用于确定底层哈希数据是否已经改变。
对于密码,您应该使用SALT +密码组合来增加HASH算法的安全性。我通常使用对用户唯一的SALT,但与密码不同,例如用户号码或初始注册IP地址。
另外,请记住,SHA1不再被推荐为哈希算法。
为了更清楚地理解,您可以参考MSDN。
此属性是密钥散列算法的关键。
基于散列的消息认证码(HMAC)可用于确定 发送通过不安全信道的消息是否已经 篡改,只要发送者和接收者共享秘密 密钥。发件人计算原始数据的散列值,并且将原始数据和HMAC作为单个消息发送。接收器重新计算接收到的消息上的散列值,并检查计算出的散列值与发送的散列值是否匹配。
HMAC可以与任何迭代加密散列函数一起使用,例如 与MD5或SHA-1结合使用一个秘密共享密钥。 HMAC的密码强度取决于底层散列函数的属性。
对数据或散列值的任何更改都会导致不匹配 ,因为需要知道密钥才能更改消息 并重现正确的散列值。因此,如果原始计算的哈希值和 匹配,则会对消息进行身份验证。