2012-01-19 46 views
0

我正在研究一些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 
} 

回答

3

它是关于与两次迭代的无盐SHA1哈希强。即非常弱。

缺乏盐可以让攻击创建彩虹表,或者只是同时攻击数据库中的所有密码哈希。

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

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

1

我不会推荐HMACSHA1用于数据库密码存储,但将密钥设置为与密码相同确实会削弱密钥在此目的中的用处。密钥应该是秘密的,用于确定底层哈希数据是否已经改变。

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

另外,请记住,SHA1不再被推荐为哈希算法。

为了更清楚地理解,您可以参考MSDN

此属性是密钥散列算法的关键。

基于散列的消息认证码(HMAC)可用于确定 发送通过不安全信道的消息是否已经 篡改,只要发送者和接收者共享秘密 密钥。发件人计算原始数据的散列值,并且将原始数据和HMAC作为单个消息发送。接收器重新计算接收到的消息上的散列值,并检查计算出的散列值与发送的散列值是否匹配。

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

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