HMAC SHA1使用相同的密钥和消息值

时间:2012-01-19 22:35:06

标签: c# .net security hmacsha1

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

psuedo代码:

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
}

2 个答案:

答案 0 :(得分:3)

它与两次迭代的无盐SHA1哈希一样强大。即非常虚弱。

缺少盐会导致攻击创建彩虹表,或者只是同时攻击数据库中的所有密码哈希值。

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

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

答案 1 :(得分:1)

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

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

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

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

  

此属性是键控哈希算法的关键。

     

可以使用基于哈希的消息认证码(HMAC)   确定是否通过不安全的通道发送了消息   如果发送者和接收者共享秘密,则篡改   键。发件人计算原始数据的哈希值   将原始数据和HMAC作为单个消息发送。该   接收器重新计算接收消息的哈希值并进行检查   计算的哈希值与传输的哈希值匹配。

     

HMAC可以与任何迭代加密哈希函数一起使用,例如   作为MD5或SHA-1,与秘密共享密钥组合使用。该   HMAC的密码强度取决于其性质   底层哈希函数。

     

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