← PC・IT用語集へ戻る

ブルートフォース攻撃

Brute Force Attack
security beginner
パスワードや暗号キーを解読するために、考えられるすべての組み合わせを片っ端から試す、最も単純かつ強力なハッキング手法。
ブルートフォース攻撃 (Brute Force Attack)

概要(サマリー)

ブルートフォース攻撃(総当たり攻撃)とは、ユーザーのパスワードや暗号キーを破るために、考えられる文字の組み合わせを「最初から最後まで力任せにすべて試す」というハッキング手法である。
たとえば、あなたが番号式(4桁のダイヤル式)の自転車の鍵をなくしてしまったとする。このとき、鍵を開けるために 0000 から始まり、0001、0002…と順番にダイヤルを回し、最終的に 9999 に至るまで全ての組み合わせを試せば、時間はかかるが正解にたどり着ける可能性が高い。
これがブルートフォース攻撃の原理である。非常に単純な手法だが、人間ではなくコンピュータの高速な計算能力を使って実行されるため、対策をしていない短いパスワードや単純な暗号キーは短時間で破られる危険がある。

詳細解説

ブルートフォース攻撃の仕組みと実行スピード

ブルートフォース(Brute Force)は英語で「暴力」「力任せ」を意味する。
攻撃者は自動でログインを試みるプログラムを使い、ターゲットのログイン画面や、盗み出したパスワードハッシュに対して、異なる候補を大量に試していく。
ただし、攻撃の速さは「オンラインでログイン画面に試すのか」「手元でハッシュ値を解析するのか」によって大きく変わる。ログイン画面には通信速度やレートリミットの制約がある一方、盗まれたハッシュ値を手元で解析するオフライン攻撃では、GPUなどを使って非常に高速に候補を試せる。もしパスワードが「数字のみ4桁」であれば組み合わせは1万通りしかないため、適切な制限がなければ短時間で突破されやすい。

ブルートフォース攻撃の主なバリエーション

  • リバースブルートフォース攻撃(逆総当たり攻撃):
    通常の攻撃が「1つのIDに対して、様々なパスワードを試す」のに対し、これは「よく使われる1つのパスワード(例: password123 など)に対して、大量のユーザーID(会員リストなど)を片っ端から試す」手法である。特定のIDが数回のログイン失敗でロックされる対策をすり抜けるために使われる。
  • 辞書攻撃(Dictionary Attack):
    すべての組み合わせを試すのではなく、辞書に載っているような単語や、人名、生年月日、よく使われるパスワードのリスト(例: admin, 123456 など)から優先的に試していく、より効率化された攻撃手法。

ブルートフォース攻撃を防ぐ主な対策

Webアプリやサーバーを開発する際、ブルートフォース攻撃からアカウントを守るために以下の対策を実装する必要がある。

  1. レートリミット(回数制限):
    同じアカウントや同じIPアドレスから、短時間に大量のログインを試せないようにする。NIST SP 800-63B-4では、オンラインの総当たりへの対策として回数制限を必須としている。連続失敗の上限は100回以下とし、上限に達した認証手段は無効化する。ログインに成功したら、それまでの失敗回数は戻す。失敗のたびに待ち時間を延ばす方法もある。
  2. 一時的なアカウントロック:
    5回程度の失敗で数分間ロックする実装もよく使われる。ただし厳しすぎると、攻撃者が失敗を繰り返すだけで正規の利用者を締め出せる。ロックは回数制限の補助であり、ロックしただけで安全になるわけではない。
  3. パスワードの長さと多要素認証:
    NIST SP 800-63B-4では、パスワードだけを認証にする場合は15文字以上、多要素認証の一部として使う場合は8文字以上を求めている。記号を必ず混ぜる規則は課していない。長く、推測されにくく、使い回していないことに加え、二要素認証があれば、パスワードが漏れてもログインを止めやすい。
  4. 画像認証(CAPTCHA)の導入:
    ログイン画面に「私はロボットではありません」のチェックボックスや、画像・行動判定を使うreCAPTCHAのような仕組みを導入し、機械(プログラム)による高速な自動入力を抑制する。ただし、CAPTCHAだけで完全に守れるわけではないため、レートリミットや多要素認証と組み合わせることが重要である。

AIコーディングとの関係

AIによるログインセキュリティの実装

AIを使ってログイン機能(ログインフォームやAPI)の実装コードを生成させる際、AIは「パスワードの照合が合っているか」という基本的な機能しか書かないことが多い。
ブルートフォース攻撃を防ぐためのアカウントロック処理や、同じIPアドレスからの接続制限(レートリミッター)のコードは、開発者がAIに対して明示的に指示を出して追加してもらう必要がある。

指示を出す際のポイント

AIにログイン処理の保護コードを依頼する際、以下のようなセキュリティ要件を指定すると安全なコードが出力される。

  • 「Node.js(Express)でログインAPIを作って。連続で5回ログインに失敗したら、そのユーザーアカウントを15分間ロックする処理をデータベースの更新も含めて実装して」
  • 「Python(Flask)のログイン画面に、レートリミットを設定して1分間に最大5回までしかログインリクエストを受け付けないようにするコードを書いて」

よくある勘違い

ハッシュ化して保存しておけばブルートフォース攻撃は怖くない?

パスワードを正しくハッシュ化してデータベースに保存することは必須だが、それだけではログイン画面からのブルートフォース攻撃は防げない。
なぜなら、攻撃者はログイン画面の入力フォームから「正規の手続き(通常のログイン操作)」を通じてパスワードを1つずつ入力して試してくるからである。どれだけデータベース内のパスワードを安全にハッシュ化していても、ログイン画面で正解のパスワードを当てられてしまえば、システムは本人としてログインを許可してしまう。そのため、保存時のハッシュ化に加えて、ログイン画面への入力回数自体を制限する対策が必要である。

私のサイトは誰も知らない個人開発のブログだから狙われない?

攻撃者は特定のサイトだけを狙って手動で攻撃しているとは限らず、インターネット上にある「セキュリティの甘いログイン画面」をプログラム(ボット)を使って自動で探し出し、無差別に攻撃を仕掛けることがある。
そのため、公開したばかりのアクセス数ゼロの個人開発サイトであっても、WAFや防御対策をしていないと、わずか数日でボットによるブルートフォース攻撃のターゲットになり、管理画面を突破されるリスクがある。

パスワードが8桁あれば総当たりされても安全?

文字の種類が「英小文字のみ」の場合、8桁の組み合わせは約2000億通りである。一見多く見えるが、盗まれたハッシュ値を手元で解析するオフライン攻撃では、高性能な機材によって短時間で大量の候補を試される可能性がある。
NIST SP 800-63B-4では、パスワードだけを認証にする場合は15文字以上、多要素認証と組み合わせる場合は8文字以上を求めている。記号の混在より、長さと使い回しの回避のほうが重要である。桁数が1文字増えるだけでも、攻撃に必要な組み合わせ数は指数関数的に増加する。

まとめ

  • ブルートフォース攻撃は、パスワードや暗号キーを解読するために、すべての文字の組み合わせを順に片っ端から試すハッキング手法である。
  • コンピュータの高速処理を利用して行われるため、対策がないと短く単純なパスワードは短時間で突破されやすい。
  • 対策には、ログイン試行の回数制限、多要素認証、必要に応じた一時ロックや画像認証(CAPTCHA)を組み合わせる。
  • AIにログイン機能を書かせる際は、セキュリティ機能(アカウントロックや接続制限)のコードも必ず指示して追加させる。

情報ソース

より詳しくAIに聞いてみよう

  • ブルートフォース攻撃に必要な時間を、パスワードの文字数(8桁、12桁、16桁)と文字の種類(英字のみ、英数記号混在)ごとに表形式でシミュレーションしてください。
  • Django(Python)やLaravel(PHP)などのフレームワークに標準搭載されている「ログイン回数制限(Throttling / Rate Limiting)」の設定方法を教えてください。
  • ハッカーが盗み出したパスワードデータベースのハッシュ値を、超高速で総当たり解析する「オフライン・ブルートフォース攻撃」の仕組みと、その対策としての「ソルト(Salt)」および「ストレッチング」の重要性を教えてください。
  • AIに「Firebase AuthやSupabaseを使ったログイン機能で、ブルートフォース攻撃や不正ログインを防ぐためのセキュリティ設定」を教えてもらいましょう。
  • パスワード認証に代わる、ブルートフォース攻撃が物理的に不可能になる最新のセキュリティ認証技術(パスキーなど)について詳しく解説してください。