HMAC 和密钥大小

信息安全 哈希 openssl hmac 钥匙
2021-08-30 18:44:08

我使用 HMAC-MD5 和 HMAC-SHA256 为具有不同长度的各种密钥的任意文件生成了密钥哈希。

我们必须在 HMAC 中使用固定大小的密钥吗?如果是这样,密钥大小是多少?如果不是,为什么?

当我尝试使用几个可变长度的键时,我确实得到了值,所以长度无关紧要?

2个回答

HMAC 是一个非常简单的结构你可以自己想出它,除了 HMAC 是标准化的,这意味着很多人看过它并发现它可以抵抗攻击。由于简单,我们可以深入了解细节:

hmac = hash(
    (key xor opad) +
    hash((key xor ipad) xor message)
)

所以它只是一些散列函数和异或值在一起,没有别的。块密码通常需要一个固定长度的密钥,但密码散列函数是“将任意大小的数据映射到一个固定大小的位串(散列)”。因此key您输入的密码可以是任意大小。上面代码片段中的hash()函数可以是任何好的加密哈希函数,例如 SHA-3 或 BLAKE2b [1]

当然,更长的时间通常会提供更多的力量。一个七字符的密码,即使它是随机的,有符号和数字等等,也总是可以用现代计算机破解。但强度不在于长度,而在于生成它的方法:一个 22 个字符的密码,即字符串“mary had a little lamb”,不如随机生成的 14 个字符的密码安全. 所以要小心选择密码的随机性:随机短语是数十亿选项之一。一个随机生成的七个字符的密码已经有 47 万亿个可能的值,即使这样也是不安全的,虽然对人类来说很难记住,所以用户密码(记忆的秘密)可能比这更弱。

当您要求用户输入密码时,请始终首先通过“慢速哈希”函数运行它。请参阅如何安全地散列密码之类的问题,以获取有关要使用的正确算法和参数的建议。只有在你这样做之后,你才应该将密码用于任何事情因此,在您将其用作 HMAC 的密钥之前,它已经得到了加强,并且在可预见的将来,随机七字符密码是不可能破解的。这样一来,攻击就不能hash()像 SHA-3 那样以该函数的速度进行,而必须以慢哈希的速度进行,这不是每秒数十亿次的猜测,而是数百次。以每秒一百个的速度浏览 47 万亿个选项需要一些时间!


[1] 我没有提到 SHA-2,因为它正在慢慢变老:它容易受到长度扩展攻击,而 SHA-3 和 BLAKE2b 则不然。HMAC 可以防止长度扩展攻击,因此带有 SHA-2 的 HMAC 很好,但我仍然宁愿推荐更新的算法(只要它们经过实战测试;它们不是那么新),而不是我知道容易受到攻击的算法在稍微不同的配置。

您可能想看看RFC 2104

  1. HMAC的定义

HMAC 的定义需要一个加密散列函数,我们用 H 表示,以及一个密钥 K。我们假设 H 是一个加密散列函数,其中数据通过在数据块上迭代基本压缩函数来散列。

我们用 B 表示这些块的字节长度(对于所有上述哈希函数的示例,B = 64),并用 L 表示哈希输出的字节长度(对于 MD5,L = 16,对于 SHA-1,L = 20 )。 认证密钥 K 可以是任意长度,最大为散列函数的块长度 B。 使用长于 B 字节的密钥的应用程序将首先使用 H 对密钥进行哈希处理,然后使用生成的 L 字节字符串作为 HMAC 的实际密钥。在任何情况下,K 的最小推荐长度是 L 字节(作为哈希输出长度)。有关键的更多信息,请参见第 3 节。

  1. 钥匙

HMAC 的密钥可以是任意长度(长于 B 字节的密钥首先使用 H 进行散列)。但是,强烈建议不要小于 L 字节,因为它会降低函数的安全强度。 超过 L 字节的密钥是可以接受的,但额外的长度不会显着增加功能强度。(如果密钥的随机性被认为很弱,则建议使用更长的密钥。)

需要随机选择密钥(或使用以随机种子为种子的加密强伪随机生成器),并定期刷新。(当前的攻击并未指明密钥更改的特定推荐频率,因为这些攻击实际上是不可行的。但是,定期密钥刷新是一种基本的安全实践,有助于防止功能和密钥的潜在弱点,并限制暴露密钥的损坏。 )

在页面顶部,您甚至可以看到RFC 6151的链接,这也可能很有趣:

  1. 安全注意事项

MD5 于 1992 年作为信息 RFC 发布。从那时起,MD5 得到了广泛的研究,并发现了新的密码攻击。消息摘要算法旨在提供碰撞、原像和第二原像抗性。此外,在 HMAC 中,消息摘要算法与共享秘密值一起用于消息认证,在这种情况下,有些人可能会发现 [SP800-57] 和 [SP800-131] 中关于密钥长度和算法强度的指导很有用。

在需要抗碰撞性(例如数字签名)的情况下,MD5 不再可接受。其他方式停止使用MD5并不急,如HMAC-MD5;然而,由于 MD5 不能用于数字签名,新的协议设计不应该使用 HMAC-MD5。当 AES 比散列函数更容易获得时,HMAC-MD5 的替代方案包括 HMAC-SHA256 [HMAC] [HMAC-SHA256] 和 [AES-CMAC]。