16

我们正在使用以下代码针对 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 位 base 64 编码字符串。有人提出了一个问题,即我们是否应该使用 HMACSHA256、HMACSHA384 或 HMACSHA512 来散列值。

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

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

4

3 回答 3

30

TL;DR:使用 HMAC-SHA512 以获得最佳速度、安全性和良好的兼容性。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. 在 8、16 和 32 位机器上,SHA-256 比 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。

于 2013-08-06T14:55:07.823 回答
5

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

于 2013-08-06T13:17:29.520 回答
1

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

于 2016-04-30T04:28:09.530 回答