0

我正在研究一些 C# 安全代码,当我看到它正在使用 HMACSHA1 类时,我正准备替换它。该代码用于散列密码以存储在数据库中。引起我注意的是它使用密码作为 HMAC 密钥,这正是计算哈希的目的。那么将数据用于密钥和您的散列可以吗?这会使安全性更强还是更弱?

伪代码:

string pwd = "My~!Cra2y~P@ssWord1#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
}
4

2 回答 2

3

它与经过两次迭代的无盐 SHA1 哈希值一样强。即相当弱。

缺少盐允许攻击创建彩虹表,或者简单地同时攻击数据库中的所有密码哈希。

低迭代次数使攻击速度更快,因为攻击者可以简单地尝试更多的候选密码。

您应该添加盐,并使用较慢的散列方法,例如 PBKDF2 和 bcrypt。.net 类Rfc2898DeriveBytes实现了 PBKDF2,所以我推荐使用那个。

于 2012-01-19T22:39:01.080 回答
1

我不推荐 HMACSHA1 用于数据库密码存储,但是将 Key 设置为与密码相同确实会削弱 Key 在此用途中的有用性。密钥应该是秘密的,用于确定底层散列数据是否已更改。

对于密码,您应该使用 SALT+Password 组合来提高 HASH 算法的安全性。我通常使用用户唯一的SALT,但与密码不同,例如用户号或初始注册IP地址。

另外,请记住,不再建议将 SHA1 作为散列算法。

您可以参考MSDN以获得更清晰的理解。

此属性是键控散列算法的键。

如果发送方和接收方共享密钥,则基于哈希的消息验证码 (HMAC) 可用于确定通过不安全通道发送的消息是否已被篡改。发送方计算原始数据的哈希值,并将原始数据和 HMAC 作为单个消息发送。接收方重新计算接收到的消息的哈希值,并检查计算的哈希值是否与传输的哈希值匹配。

HMAC 可以与任何迭代加密散列函数(例如 MD5 或 SHA-1)结合使用,并与秘密共享密钥结合使用。HMAC 的加密强度取决于底层散列函数的属性。

对数据或哈希值的任何更改都会导致不匹配,因为需要知道密钥才能更改消息并重现正确的哈希值。因此,如果原始散列值和计算的散列值匹配,则消息通过身份验证。

于 2012-01-19T22:48:46.960 回答