有人建议使用简单的字符串比较来匹配密码,因timing attacks而不安全。例如,请参阅this question。 好吧,我试着测量node.js中两个密码猜测之间的时差。 这是代码:
const pass = '................................................................';
const guess1 = '..X.............................................................';
const guess2 = '.............................................................X..';
function ns(hrtime) {
return hrtime[0] * 1e9 + hrtime[1];
}
test(guess1);
test(guess2);
test(guess1);
test(guess2);
test(guess1);
test(guess2);
test(guess1);
test(guess2);
test(guess1);
test(guess2);
test(guess1);
test(guess2);
function test(guess) {
const start = process.hrtime();
for (let i = 0; i < 1e5; ++i) {
if (guess === pass) throw new Error('HIT');
}
const time = ns(process.hrtime(start));
console.log('%d ns %s', time, guess);
}
以下是在我的机器上执行一次的结果:
2073045 ns ..X.............................................................
58420 ns .............................................................X..
57778 ns ..X.............................................................
57468 ns .............................................................X..
57554 ns ..X.............................................................
57436 ns .............................................................X..
57589 ns ..X.............................................................
57798 ns .............................................................X..
57798 ns ..X.............................................................
57506 ns .............................................................X..
57969 ns ..X.............................................................
57974 ns .............................................................X..
时间与不同的密码猜测之间似乎没有相关性。 我做错了什么或者确实没有可衡量的时差?
答案 0 :(得分:2)
1)我希望你能安全地散列密码。这意味着人们可以计算哈希彼此之间的距离。只要散列函数是安全的,根本没有帮助。
2)直接在机器上测量和现实世界的攻击之间存在差异。当攻击者对包含网络延迟以及node.js延迟的请求进行计时时。如果我们谈论纳秒,没有人会注意到任何差异。