HMACSHA256和HMACSHA512之间的差异

本文关键字:之间 HMACSHA512 HMACSHA256 | 更新日期: 2023-09-27 18:26:33

我们使用以下代码针对C#中的敏感值生成HMac哈希

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对值进行散列。

  • 与HMACSHA256相比,使用HMACSHA512有哪些优势
  • 它是否更安全
  • 使用较长的密钥是否会对性能产生显著影响

作为旁注;如果我使用HMACSHA512,那么我传递给构造函数的decodedKey值是否需要是512位密钥?

HMACSHA256和HMACSHA512之间的差异

TL;DR:使用HMAC-SHA512实现最佳速度、安全性和OK兼容性。HMAC-SHA256也非常安全,可以在具有32位操作的CPU上使用。此外,它在许多最新的CPU上加速。


要了解哈希方法本身的强度,请查看keylength.com网站。你会看到,即使是SHA-256也有相当大的安全余量。

更重要的是,HMAC算法几乎忽略了对底层哈希算法的攻击。HMAC不受生日问题的影响,该问题将密钥强度减半为哈希输出的一半。它不适用,仅仅是因为对手没有持有密钥,因此不能试图制造冲突。这就是为什么即使是HMAC-SHA1也是相当安全的。


现在散列的速度取决于执行环境。但一般来说,你可以做出以下假设:

  1. SHA-1通常比同一平台上的任何SHA-2实现都快
  2. SHA-512在64位机器上比SHA-256更快(因为它们内部使用64位算术)
  3. SHA-256在8、16和32位机器上比SHA-512更快

如果您预计会出现兼容性问题,请使用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并且彼此不同;称为域分离的功能。域分离使得无法使用攻击或(部分)预测其他相关哈希函数的哈希结果。


输入密钥大小不依赖于基础哈希函数。密钥首先被XOR屏蔽,然后被底层散列函数散列;散列算法可以接受几乎无限数量的数据作为输入。

建议使用至少为所用哈希方法大小的密钥大小,否则可能会降低HMAC方法提供的安全边际。如果密钥大小迫使哈希算法对多个块进行哈希,则可能会有较小的性能损失。


您也可以使用(即将推出的)SHA-3标准,因为它是安全的。HMAC-SHA-3目前没有太多意义。HMAC实际上对SHA-3(Keccak)来说过于夸张了;即使没有HMAC结构,SHA-3也应该是安全的。到目前为止,KMAC已被标准化为SHA-3的MAC结构。

令人惊讶的是,在SHA-3竞赛期间,SHA-2构建体对密码分析表现出了相当好的抵抗力。因此,没有迫切需要升级到KMAC/SHA-3。

我认为你不需要担心安全优势,HmacSha1仍然被认为是安全的,安全性应该被认为是相对于密钥长度的。Sha256与Sha512的性能将取决于实现、平台等,您必须测试自己。您提供给HMAC的密钥长度与哈希算法无关,请参阅伪代码。

HMAC调用哈希算法两次,而SHA3不需要HMAC构造来进行键控哈希,因此可以轻松避免双重调用。因此,SHA3在性能上击败了HMAC-SHA2,在安全性上击败了HMAC-SHA1(两全其美)。