はい、文字列比較(および/またはインデックスルックアップ)は、原則として、データベースに保存されているパスワードハッシュと入力されたパスワード共有から計算されたものと同一の先行バイト数をリークする可能性があります。
原則として、攻撃者はこれを使用して、パスワードハッシュのプレフィックスをバイトごとに繰り返し学習できます。最初に、データベース内のハッシュと最初のバイトを共有するハッシュを見つけ、次に最初の2<を共有するハッシュを見つけます。 / em> バイトなど。
いいえ、これはほぼ間違いなく問題ではありません。
なんで?ええと、いくつかの理由で:
-
タイミング攻撃は可能性があります 攻撃者がユーザーのパスワードハッシュの一部を学習できるようにします。適切に設計されたパスワードハッシュスキーム(ソルトと
キーストレッチ を使用) )ただし、攻撃者が全体を知っている場合でも、安全を維持する必要があります(もちろん、パスワード自体は簡単に推測できないと想定しています)。 パスワードハッシュ。したがって、タイミング攻撃が成功した場合でも、パスワード自体は安全です。 -
攻撃を実行するには、攻撃者はハッシュ値がわかっているパスワードを送信する必要があります。ハッシュ値はソルトによって異なります。したがって、攻撃者がすでに塩を知っていない限り、この攻撃は不可能です。
(確かに、パスワードハッシュスキームのほとんどのセキュリティ分析では、ソルトは公開情報であると見なされます。ただし、これは、攻撃者がすでにコピーを取得している上記の最悪のシナリオを想定しているためです。ユーザーデータベース全体、ソルトとハッシュ、およびすべて。攻撃者がまだハッシュを知らない場合、ソルトを知っていると想定する理由はありません。)
-
攻撃者がソルトを知っている場合でも、上記の反復攻撃を実行するには、目的のプレフィックスを持つ値にハッシュするパスワードを生成する必要があります。安全なハッシュ関数の場合、これを行うための唯一の実用的な方法は、エラーを試行することです。つまり、これを行うために必要な時間は、プレフィックスの長さに比例します。
これが実際に意味することは、ハッシュの十分な数のビットを抽出して、ハッシュに対してオフラインのブルートフォース攻撃を実行できるようにすることです(すべてである必要はありません。有効なエントロピーの量を超えるだけです。パスワード)、攻撃者はパスワード自体を解読するために必要なだけの計算を実行する必要があります。 適切に設計されたパスワードハッシュスキームと安全に選択されたパスワードの場合、これは実行可能ではありません。
-
反復攻撃ができること 原則として、攻撃者に与えるのは、システムにかなり少数のパスワードを送信するだけで、ほとんどのブルートフォース計算をローカルで実行できることです。ただし、これでも、各から詳細で信頼できるタイミング情報を受け取った場合にのみ当てはまります。 提出されたパスワード。実際には、実際のタイミング攻撃は非常に非効率的です 、および any を生成するには、多くの(多くの場合、数千または数百万の)クエリが必要です。 まったく役立つ情報。これにより、タイミング攻撃が攻撃者にもたらす可能性のある潜在的なパフォーマンス上の利点が相殺される可能性が非常に高くなります。
この点は、適切なキーストレッチパスワードハッシュスキームを使用することで増幅されます。このようなスキームは意図的に低速になるように設計されているためです。したがって、データベースでの文字列の比較は、最初にパスワードをハッシュする場合と比較して、ごくわずかな時間しかかからない可能性があり、そのため、パスワードによって引き起こされるタイミングの変動は、ノイズの中で失われます。