在 Node 中比较 hmac 签名的首选方法是什么?
What is the preferred way of comparing hmac signatures in Node?
我了解到,进行字符串比较并不是确定 hmac 签名是否匹配的首选方法。 (Go to Step 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")
?
不首选普通字符串比较的原因是,它通常会 return 一旦发现两个字符串之间存在差异就会立即得出结果。这可以为基于时间的攻击打开大门;如果我试图为一条消息猜测正确的 HMAC,而我的猜测与第一个字符中的真实字符串不同,那么我将比第二个、第三个字符的差异更快地得到 "fail" 响应,第四个……性格。是的,时差很小,但确实可以测量。
首选技术是使用所谓的 "constant-time comparison" 函数。这种函数被设计成无论参数不同的位置如何都消耗相同的时间。通过不在发现不匹配时立即 returning,它不会向攻击者提供有关不匹配位置的信息。
在 Node 中,适当的函数是 crypto.timingSafeEqual(a,b)。
我了解到,进行字符串比较并不是确定 hmac 签名是否匹配的首选方法。 (Go to Step 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")
?
不首选普通字符串比较的原因是,它通常会 return 一旦发现两个字符串之间存在差异就会立即得出结果。这可以为基于时间的攻击打开大门;如果我试图为一条消息猜测正确的 HMAC,而我的猜测与第一个字符中的真实字符串不同,那么我将比第二个、第三个字符的差异更快地得到 "fail" 响应,第四个……性格。是的,时差很小,但确实可以测量。
首选技术是使用所谓的 "constant-time comparison" 函数。这种函数被设计成无论参数不同的位置如何都消耗相同的时间。通过不在发现不匹配时立即 returning,它不会向攻击者提供有关不匹配位置的信息。
在 Node 中,适当的函数是 crypto.timingSafeEqual(a,b)。