タイミング攻撃を防ぐとき、異なる長さで終了しても安全ですか?
一般的にはありませんが、状況によって異なります。
関数自体
この関数は、実行時間が常に入力の長さに依存するため、長さの比較に関係なく、タイミング攻撃で情報を漏えいします。
長さ比較では、両方の入力が同じ長さの場合、実行時間が変わります。
長さの比較がなければ、実行時間は短い方の入力の長さに基づいて変化します (の理由zip
)。攻撃者が制御する入力が他の入力の長さを超えると、実行時間は一定のままになります。
ただし、この関数の実行時間は非常に短いため (非科学的なテストでは、32 バイトの入力に対して 0.1 ミリ秒未満であることが示されています)、実際の状況では、次のような他の要因により、攻撃者がこれを利用することはかなり困難です。ネットワーク遅延の変動。攻撃者は、この脆弱性を実際に利用するために、コードが実行されているマシンに既にいる必要があるでしょう。
Flask-bcrypt について
ただし、flask-bcrypt のコンテキストでは、この関数はハッシュの比較にのみ使用され、直接のユーザー入力には使用されません。bcrypt が出力するハッシュ長は固定であるため、return False
実際には実行されません。したがって、bcrypt で使用する場合、この関数に対するタイミング攻撃は存在しません。
Flask-bcrypt は、Python での通常の文字列比較 (==) の実行時間が文字列の内容に基づいて変化するため、この関数を使用して等価性をチェックします。同じ長さの 2 つのほぼ同一の文字列を考えてみましょう。2 つの文字列の最初の文字が異なる場合、== 比較は、文字列の最後の文字で違いが発生する場合よりも速く完了します。
ただし、この場合、一定時間の文字列比較は本当に不要であると主張します。攻撃者の目標は、処理時間に基づいて保存されたハッシュ値を推測することです。攻撃者は、これを達成するために、入力によって生成されたハッシュ値を知る必要があります。ただし、どのハッシュが生成されているかを知る唯一の方法は、攻撃者がワークファクターとソルトを知ることです。攻撃者がこの情報を持っている場合は、ハッシュも既に持っています (それらはすべて一緒に保存されているため)。その場合、そもそも攻撃を実行する理由はありません。