繁体   English   中英

HMACSHA256 和 HMACSHA512 的区别

[英]Difference between HMACSHA256 and HMACSHA512

我们正在使用以下代码针对 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 有哪些优势?
  • 它明显更安全吗?
  • 使用更长的密钥时是否有显着的性能影响?

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

TL;DR:使用 HMAC-SHA512 以获得最佳速度、安全性和良好的兼容性。 HMAC-SHA256 也非常安全,在具有 32 位操作的 CPU 上可能很有用。 此外,它在许多最新的 CPU 上都得到了加速。


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

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


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

  1. SHA-1 通常比同一平台上的任何 SHA-2 实现更快;
  2. 在 64 位机器上,SHA-512 比 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 和彼此不同; 一种称为域分离的功能。 域分离使得无法使用攻击或(部分)预测其他相关哈希函数的哈希结果。


输入密钥大小不依赖于底层哈希函数。 密钥首先进行异或掩码,然后由底层散列函数散列; 哈希算法可以将几乎无限量的数据作为输入。

建议使用的密钥大小至少是所用散列方法的大小,否则可能会降低 HMAC 方法提供的安全余量。 如果密钥大小强制散列算法散列多个块,则可能会有轻微的性能损失。


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

SHA-2 结构在 SHA-3 竞赛期间表现出相当好的抵抗密码分析的能力——有点令人惊讶。 所以没有迫切需要升级到 KMAC / SHA-3。

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

HMAC 两次调用散列算法,而 SHA3 不需要 HMAC 构造来进行键控散列,因此很容易避免双重调用。 因此,SHA3 在性能上胜过 HMAC-SHA2,在安全性上胜过 HMAC-SHA1(两全其美)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM