【发布时间】:2013-10-04 22:18:19
【问题描述】:
我正在使用 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);
}
我认为这对计时攻击是不安全的,因为将 1 添加到 similarity 可能比什么都不做要花费更多的时间。我也不知道 JavaScript 相等运算符有多安全。
另一个引起我注意的使用缓冲区的解决方案是node-buffertools,但它使用memcmp 来比较缓冲区(我知道这不安全)。
比较两个 XORed 缓冲区与避免计时攻击的第三个缓冲区的最佳方法是什么?与 C++ 扩展相比,我更喜欢纯 JavaScript 解决方案。
【问题讨论】:
-
不知道“比较两个 XORed 缓冲区的最佳方法”的答案,但您可以在返回之前花费额外的时间。这不可行吗?
-
是的,我还计划延迟身份验证响应。我不确定它本身是否足以应对定时攻击,即使延迟是随机的。
-
是的,我想进行一些测试以了解 XOR 操作需要多长时间,并添加一个 setTimeout 包装器以确保函数在较长时间后返回(在这两种情况下)
-
另外,除了问题,它是什么认证方法?带有规格的链接可能有用(这将是出于我个人的好奇心/利益)
标签: javascript node.js security timing