将多个秘密组合成一个 HMAC 密钥的正确方法?

信息安全 hmac
2021-08-17 06:17:13

我正在使用 HMAC+SHA256 来签署和验证 Web 应用程序中的声明。每个部署都有自己的加密随机 512 位密钥,我可以将其用作 HMAC 密钥,但在某些情况下,我也想混入另一个密钥。例如,通过混合用户的哈希密码作为密钥的一部分,一旦用户更改密码,令牌就会失效,这对于密码重置链接很有用。

我的主要问题是:将多个秘密混合在一起形成 HMAC 密钥的正确方法是什么?

一种可能性是将秘密连接在一起,但我已经用我的 512 位实例范围的秘密达到了 HMAC+SHA256 的最大有效密钥长度。XOR 是更好的选择吗?

或者有没有更好的方法将多个密钥混合在一起,例如嵌套 HMAC 调用?例如HMAC(HMAC(claims, secret1), secret2)

作为一个辅助问题:首先这样做是否合适?我喜欢这样说,如果秘密 X 发生变化,那么令牌会自动失效,而不会将秘密公开为声明使用多个秘密签署令牌似乎是一种很好的方法。以这种方式使用机密(特别是用户的散列密码)是否有任何问题我应该注意?

1个回答

起初,在我看来,对加密随机密钥进行异或运算是一个很好的解决方案,因为生成的密钥也是加密安全的(参考https://crypto.stackexchange.com/questions/48145/xor-a-set-of -随机数),即HMAC(claims, secret1 ^ secret2)但要使其正常工作,您需要分享您的部署秘密 - 如果可能,请避免。

嵌套 HMAC 计算的优点HMAC(HMAC(claims, secret1), secret2)是每个部署都可以计算 HMAC,而无需与任何其他部署共享其秘密。

作为替代方案,更好的解决方案可能是 HMAC 结果的异或,而不是嵌套它们,即HMAC(claims, secret1) ^ HMAC(claims, secret2). 这种方法为每个 HMAC 操作保留了来自声明的更多信息。