我正在研究一些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
}
答案 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的密码强度取决于其性质 底层哈希函数。
对数据或哈希值的任何更改都会导致不匹配, 因为需要知道密钥才能改变消息 并重现正确的哈希值。因此,如果原来和 计算的哈希值匹配,消息经过身份验证。