2017-10-08 18 views
2

単純な文字列比較を使用してパスワードを照合すると、timing attacksが原因で安全でないことが示唆されている人もいます。たとえば、this questionを参照してください。 まあ、node.jsの2つのパスワード推測の時間差を測定しようとしました。ここ はコードです:ここでは文字列の比較は本当に安全ではありませんか?

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.. 

時間と異なるパスワードとの間に相関性はなかっあるようです推測する。 私は何か間違っているか、実際には時間差はありませんか?

+2

人々はこのリスクを回避しませんでした。あなたが最初の試行でそれを再現しないという理由だけで、それが存在しないことを意味するわけではありませんので、件名にたくさん書かれているので、少し研究を行います。 [文字列比較に対するタイミング攻撃](https://thisdata.com/blog/timing-attacks-against-string-comparison/)および[タイミング攻撃にnode.jsイベントループを使用する](https://snyk.io)を参照してください。/blog/node-js-timing-attack-ccc-ctf /)と他の何百もの参考文献をGoogle検索で簡単に見つけました。 – jfriend00

+1

実際のタイミングリスクがあるかどうかは、以前のコメントに追加するには、使用される正確な状況とコードによって決まります。したがって、タイミングリスクを評価するためには、生産コードの実例を示す必要があります。そのようなリスクを抱えている状況があるかどうかを気にすることさえ避けるために、多くの人は、タイミングニュートラルな比較を安全性の最も簡単な方法として選択するだけです。 – jfriend00

答えて

2

1)パスワードを安全にハッシュしてください。これは、ハッシュが互いにどのくらい近いかを測定することができることを意味します。ハッシュ関数が安全である限り、それはまったく役に立たない。

2)マシン上での直接測定と実際の攻撃の違いがあります。攻撃者がネットワークのレイテンシとnode.jsのレイテンシを含むリクエストに時間を合わせた場合。私たちがナノ秒を話しているなら、誰も何の違いに気付かないでしょう。

+0

プロセス内で測定できない場合は、外部から測定することもできます。または、hrtimeのタイミングが間違っているとお考えですか? –

+0

@peter no thatsまさに2)が意味するべきこと –

関連する問題