确定截断 HMAC 的强度

信息安全 哈希 hmac
2021-09-01 00:41:26

我将数据存储在必须保证完整性的设备上,为了便于解释,这些数据就像代表“可用信用余额”的数字字段。

该设备只与一台计算机交互;因此,我希望使用 HMAC 验证余额的完整性:计算机读取余额和 MAC,使用其私钥对其进行验证,更新余额并计算新的 HMAC,然后将其写回设备。

限制:我希望哈希只有 32 位,所以我会截断它。密钥可以任意长,我可以使用 SHA1 等。

我是否可以安全地假设即使哈希是 32 位攻击者也找不到密钥?如果哈希是 8 位呢?

在这个系统中,如果设备提供了无效的 MAC,计算机将阻止它,因此攻击者只有一次尝试提供有效的消息/MAC 组合。

注意:我已阅读此 security.SE 问题,但我对答案和对答案的第三条评论(@LateralFractal)感到困惑,否则这是一个类似的问题。

2个回答

细节很重要。

正如@Ricky 指出的那样,与不会截断 HMAC 值的类似情况相比,显示截断的 HMAC 值不会帮助攻击者找到密钥。这是有道理的:截断只删除信息。

但是,攻击者最终并没有获得密钥。攻击者真正想要的是伪造,即计算一些计算机将接受为自己的 HMAC 值。找出密钥可以进行伪造,但伪造的能力并不一定需要知道私钥。

幸运的是,HMAC 往往表现得像PRF,因此有两种已知的伪造方法:

  1. 对可能的密钥执行暴力枚举,直到找到正确的密钥(与几个已知值+HMAC 对匹配的密钥)。通过选择足够大的空间以使枚举不切实际(即,您生成具有加密强 PRNG 的 128 位密钥)的密钥来击败此攻击。

  2. 运气。攻击者发送一个随机的比特序列作为 HMAC 值,并希望它能够工作。通过不将 HMAC 值截断到太小的长度和/或应用其他缓解措施(例如只允许一次尝试和不可撤销地拒绝曾经显示甚至单个虚假 HMAC 值的设备(如您所做的那样))来击败此攻击。

“运气”攻击的概率为 2 - n,其中n是截断的 HMAC 输出的大小(以位为单位)。即,如果输出为 32 位,那么基于运气的伪造有 40 亿分之一左右的概率未被发现。总的来说,这是 32 位输出所能做到的最好的;HMAC 表现为 PRF 意味着它在这方面是“最佳的”。如果截断到 8 位,那么攻击成功的概率是 256 分之 1,这可能太不舒适了。但这是您根据使用情况做出的决定。

另外(再次正如@Ricky 指出的那样),请注意重放攻击一个有效的 MAC,假设没有伪造,只向计算机证明它在某个时候看到并“批准”了消息内容——但不是它是它看到的最后一条消息。旧的消息-HMAC 对可以由假设备再次发送。要击败重放攻击,您必须在计算机上保持某种状态(计算机必须记住有关设备的某些信息,例如“消息序列号”,它是计算 MAC 的数据的一部分,并为每条消息递增) .

是的。是的。

B 与 A 和挑战者的交互如下:B 将来自 A 的所有查询转发给挑战者,
并给出与 A 相同的输出。对于来自挑战者的每个响应,B 截断响应
并将截断的响应发送给 A。A 在该交互与 A 在
您使用相同密钥的场景的交互中的视图相同,因此如果 A 找到密钥,那么 B 也会找到。

B 是从找到 HMAC 的密钥到找到
截断 HMAC 的密钥的建设性减少。因此,如果 HMAC 的“攻击者找不到密钥”,
那么“即使哈希被截断,攻击者也无法找到密钥”。

请注意,您需要一些东西来防止重复使用旧的平衡标签对。



“截断精心设计的加密” PRF “不应导致任何安全漏洞 ,而只会
减少” codomain的大小。根据定义, “As”PRF在其域中是伪随机的。

“所有其他条件相同,使用更现代的哈希算法”
(SHA-256)“比使用旧的更安全”(SHA-1)。


“假设你想要 2^16 而不是 2^256。这是一个惊人的下降”标签“空间大小。在 2^16 或 2^32”时
,随机标签将具有 1/(2^16) 或 1/ (2^32) 分别被接受的机会。“虽然 QR 码
在较长尺寸下的响应速度较慢,”但标签长度与伪造概率之间存在折衷。