我正在使用 NodeJS 编写一个应用程序,它使用两个 Base64 编码的令牌来验证用户身份。这两个标记在异或时应该与存储在数据库中的第三个标记匹配。
这就是我现在所拥有的:
function verifyTokens(encodedTokens) {
var similarity = 0;
var buffers = encodedTokens.map(base64.decode);
for (i = 0; i < TOKEN_LENGTH; i++) {
if ((buffers[0][i] ^ buffers[1][i]) === buffers[2][i]) {
similarity += 1;
}
}
return (similarity === TOKEN_LENGTH);
}
我相信这对定时攻击是不安全的,因为加 1similarity
可能比什么都不做要花费更多的时间。我也不知道 JavaScript 相等运算符有多安全。
另一个引起我注意的处理缓冲区的解决方案是node-buffertools,但它用于memcmp
比较缓冲区(我知道这不安全)。
将两个 XORed 缓冲区与避免定时攻击的第三个缓冲区进行比较的最佳方法是什么?与 C++ 扩展相比,我更喜欢纯 JavaScript 解决方案。