在Node中比较hmac签名的首选方法是什么?

New*_*ang 3 cryptography hmac node.js

我已经读过,进行字符串比较并不是确定hmac签名是否匹配的首选方法.(转到步骤5)所以,在Node中,给出类似这样的东西

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

if(computed !== req.header("signature")){
   throw
}
Run Code Online (Sandbox Code Playgroud)

如果不是用于字符串比较,那么这条线的首选方式是什么computed !== req.header("signature")?

ott*_*ter 7

普通字符串比较不是首选的原因是,一旦找到两个字符串之间的差异,它通常会返回结果.这可以为基于时间的攻击敞开大门; 如果我正在尝试猜测一条消息的正确HMAC并且我的猜测与其第一个字符中的真实字符串不同,那么我将得到一个"失败"响应,而不是差异在第二,第三,第四. ..性格.是的,时差很小,但实际上可以衡量.

首选技术是使用所谓的"恒定时间比较"功能.无论参数的位置如何,这种函数都被设计为消耗相同的时间.一旦发现不匹配就不返回,它会向攻击者提供关于不匹配位置的信息.

在Node中,相应的函数是crypto.timingSafeEqual(a,b).