首页 > 解决方案 > 在 Node 中比较 hmac 签名的首选方法是什么?

问题描述

我读过进行字符串比较不是确定 hmac 签名是否匹配的首选方法。(转到第 5 步)因此,在 Node 中,给定这样的内容

const hmac = crypto.createHmac("sha256", signingSecret).update(buf, encoding);
const computed = `${version}=${hmac.digest('hex')}`;

if(computed !== req.header("signature")){
   throw
}

如果不是用于字符串比较,那么执行此行的首选方法是什么:computed !== req.header("signature")

标签: node.jscryptographyhmac

解决方案


不首选普通字符串比较的原因是它通常会在发现两个字符串之间存在差异时立即返回结果。这可以为基于时间的攻击打开大门;如果我试图猜测消息的正确 HMAC 并且我的猜测与第一个字符中的真实字符串不同,我会比第二个、第三个、第四个不同时更快地得到“失败”响应。 .. 特点。是的,时差很小,但确实可以测量。

首选技术是使用所谓的“恒定时间比较”功能。这种函数旨在消耗相同的时间,而不管参数不同的位置如何。通过在发现不匹配时不立即返回,它不会向攻击者提供有关不匹配位置的信息。

在 Node 中,适当的函数是crypto.timingSafeEqual(a,b)


推荐阅读