字符串比较真的不安全吗?

时间:2017-10-08 21:30:10

标签: javascript node.js security

有人建议使用简单的字符串比较来匹配密码,因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..

时间与不同的密码猜测之间似乎没有相关性。 我做错了什么或者确实没有可衡量的时差?

1 个答案:

答案 0 :(得分:2)

1)我希望你能安全地散列密码。这意味着人们可以计算哈希彼此之间的距离。只要散列函数是安全的,根本没有帮助。

2)直接在机器上测量和现实世界的攻击之间存在差异。当攻击者对包含网络延迟以及node.js延迟的请求进行计时时。如果我们谈论纳秒,没有人会注意到任何差异。