【问题标题】:Difference between HMACSHA256 and HMACSHA512HMACSHA256 和 HMACSHA512 的区别
【发布时间】:2013-08-07 11:24:37
【问题描述】:

我们正在使用以下代码针对 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 位密钥?

【问题讨论】:

标签: c# security cryptography hmac


【解决方案1】:

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

【讨论】:

  • NIST 转换文档 (csrc.nist.gov/publications/nistpubs/800-131A/sp800-131A.pdf),表 9:哈希函数转换,不允许 SHA-1 用于 2013 年之后的某些用途,包括数字签名。 SHA-1 对于 HMAC 的使用可能仍然是可以接受的,但 SHA-2 是广泛可用的,并且出于任何安全考虑不被弃用。作为开发人员,您对使用因隐含弱点而被逐步淘汰的安全算法感到满意吗?
  • 我不推荐使用 HMACSHA1,我只是把它作为一个遥远的例子,不用担心 HMACSHA512 与 HMACSHA256 的安全性,而是专注于密钥长度。
【解决方案2】:

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


要查看哈希方法本身的强度,请查看keylength.com website。你会看到,即使是 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。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      相关资源
      最近更新 更多