我们使用下面的代码来针对HMac中的敏感值生成一个C#哈希
public string GenerateHMac(string key, string message)
{
var decodedKey = Convert.FromBase64String(key);
var hasher = new HMACSHA256(decodedKey);
var messageBytes = Encoding.Default.GetBytes(message);
var hash = hasher.ComputeHash(messageBytes);
return Convert.ToBase64String(hash);
}传入的密钥是256位基64编码字符串。有人提出了一个问题,即我们应该使用HMACSHA256、HMACSHA384还是HMACSHA512来散列值。
顺便提一句,如果我使用decodedKey,我要传递给构造函数的HMACSHA512值是否需要是一个512位键?
发布于 2013-08-06 14:55:07
TL;DR:使用HMAC- use 512实现最佳的速度、安全性和OK兼容性.HMAC- bit 256也非常安全,可用于32位操作的CPU.此外,它在许多最新的CPU上加速。
要查看散列方法本身的强度,请查看keylength.com网站。您将看到,即使是SHA-256也有相当大的安全性。
更重要的是,HMAC算法几乎忽略了对底层哈希算法的攻击。HMAC不受生日问题的影响,该问题将关键强度减半到哈希输出的一半。它并不是简单的应用,因为对手没有掌握秘密密钥,因此不能尝试创建冲突。这就是为什么连HMAC-SHA1 1都相当安全的原因。
现在哈希的速度取决于执行环境。但一般来说,你可以做以下假设:
如果您预期会出现兼容性问题,请使用SHA-1。否则,您还可以选择SHA-512 (并将结果削减到合理的位数)。SHA-512的内部状态和更高的安全性可能是一个小小的优势。由于算法的一般问题,我遇到了客户不接受任何形式的SHA-1的问题;换句话说,它在一般情况下不安全这一事实可能会阻碍接受。
注意,SHA-384和鲜为人知的SHA-512/256和SHA-512/224散列方法是SHA-512的一种特殊形式,被切割到384、256和224位输出。因此,这些算法的速度是相同的。除了输出大小之外,唯一的区别是这些特殊形式在内部使用不同的初始值。否则,SHA-512切割到384位的安全性和速度与SHA-512/384相同。但是,如果需要特定的输出大小,则应该使用SHA-384来保持兼容。
SHA-384和SHA-512/256和SHA-512/224使用不同的初始值,因此它们的输出与SHA-512和SHA-512不同,这是一种称为域分离的特性。域分离使得无法使用攻击或(部分)预测其他相关哈希函数的哈希结果。
输入键大小不依赖于基础哈希函数。关键首先是XOR蒙面,然后由底层哈希函数进行散列;哈希算法可以将几乎无限数量的数据作为输入。
建议使用至少与使用的散列方法大小相同的密钥大小,否则可能会降低HMAC方法提供的安全裕度。如果密钥大小强制哈希算法散列多个块,则可能会造成较小的性能损失。
您还可以使用(即将推出的) SHA-3标准,因为它是安全的。HMAC-SHA-3目前没有太多的意义。HMAC实际上是SHA-3 (Keccak)的过度杀伤;即使没有HMAC构造,SHA-3也应该是安全的。到目前为止,KMAC已被标准化为SHA-3的MAC结构.
SHA-2结构在SHA-3比赛中表现出了相当好的抵抗隐秘分析的能力,这有点令人惊讶.因此,没有迫切需要升级到KMAC / SHA-3。
发布于 2013-08-06 13:17:29
发布于 2016-04-30 04:28:09
HMAC两次调用哈希算法,而SHA3不需要对密钥哈希进行HMAC构造,因此双调用很容易避免。因此,SHA3在性能上优于HMAC-SHA1 2,在安全性方面优于HMAC-SHA1 1(这两者都是最好的)。
https://stackoverflow.com/questions/18080445
复制相似问题