ブルートフォース攻撃
Brute Force Attack
概要(サマリー)
ブルートフォース攻撃(総当たり攻撃)とは、ユーザーのパスワードや暗号キーを破るために、考えられる文字の組み合わせを「最初から最後まで力任せにすべて試す」というハッキング手法である。
たとえば、あなたが番号式(4桁のダイヤル式)の自転車の鍵をなくしてしまったとする。このとき、鍵を開けるために 0000 から始まり、0001、0002…と順番にダイヤルを回し、最終的に 9999 に至るまで全ての組み合わせを試せば、時間はかかるが正解にたどり着ける可能性が高い。
これがブルートフォース攻撃の原理である。非常に単純な手法だが、人間ではなくコンピュータの高速な計算能力を使って実行されるため、対策をしていない短いパスワードや単純な暗号キーは短時間で破られる危険がある。
詳細解説
ブルートフォース攻撃の仕組みと実行スピード
ブルートフォース(Brute Force)は英語で「暴力」「力任せ」を意味する。
攻撃者は自動でログインを試みるプログラムを使い、ターゲットのログイン画面や、盗み出したパスワードハッシュに対して、異なる候補を大量に試していく。
ただし、攻撃の速さは「オンラインでログイン画面に試すのか」「手元でハッシュ値を解析するのか」によって大きく変わる。ログイン画面には通信速度やレートリミットの制約がある一方、盗まれたハッシュ値を手元で解析するオフライン攻撃では、GPUなどを使って非常に高速に候補を試せる。もしパスワードが「数字のみ4桁」であれば組み合わせは1万通りしかないため、適切な制限がなければ短時間で突破されやすい。
ブルートフォース攻撃の主なバリエーション
- リバースブルートフォース攻撃(逆総当たり攻撃):
通常の攻撃が「1つのIDに対して、様々なパスワードを試す」のに対し、これは「よく使われる1つのパスワード(例:password123など)に対して、大量のユーザーID(会員リストなど)を片っ端から試す」手法である。特定のIDが数回のログイン失敗でロックされる対策をすり抜けるために使われる。 - 辞書攻撃(Dictionary Attack):
すべての組み合わせを試すのではなく、辞書に載っているような単語や、人名、生年月日、よく使われるパスワードのリスト(例:admin,123456など)から優先的に試していく、より効率化された攻撃手法。
ブルートフォース攻撃を防ぐ主な対策
Webアプリやサーバーを開発する際、ブルートフォース攻撃からアカウントを守るために以下の対策を実装する必要がある。
- アカウントロック(Account Lockout):
同じアカウントでログイン失敗が一定回数(例: 5回)連続した場合、数分間〜数時間アカウントを一時的に凍結(ロック)し、それ以上の入力を受け付けないようにする。 - レートリミット(接続数制限):
同一のIPアドレスから、短時間に大量のログインリクエストが送信されてきた場合、サーバー側で自動的にそのアクセスを一時的に遮断する。 - パスワードの強度と多要素認証(2FA):
長く、推測されにくく、使い回していないパスワードにすることで、総当たりに必要な組み合わせ数を大きく増やせる。また、二要素認証を導入しておけば、万が一パスワードが破られても、追加の認証要素によって不正ログインを防ぎやすくなる。 - 画像認証(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億通りである。一見多く見えるが、盗まれたハッシュ値を手元で解析するオフライン攻撃では、高性能な機材によって短時間で大量の候補を試される可能性がある。
安全性を高めるためには、単に記号を混ぜるだけでなく、十分に長く、推測されにくく、他サービスで使い回していないパスワードにすることが重要である。桁数が1文字増えるだけでも、攻撃に必要な組み合わせ数は指数関数的に増加する。
まとめ
- ブルートフォース攻撃は、パスワードや暗号キーを解読するために、すべての文字の組み合わせを順に片っ端から試すハッキング手法である。
- コンピュータの高速処理を利用して行われるため、対策がないと短く単純なパスワードは短時間で突破されやすい。
- 対策には、アカウントロック機能、IPアドレス単位のアクセス回数制限(レートリミット)、多要素認証(2FA)、画像認証(CAPTCHA)などを組み合わせる方法がある。
- AIにログイン機能を書かせる際は、セキュリティ機能(アカウントロックや接続制限)のコードも必ず指示して追加させる。
情報ソース
- 総務省: 国民のためのサイバーセキュリティサイト
- OWASP Cheat Sheet Series: Authentication Cheat Sheet(ブルートフォース対策)
- NIST SP 800-63B: Authentication and Authenticator Management
より詳しくAIに聞いてみよう
- ブルートフォース攻撃に必要な時間を、パスワードの文字数(8桁、12桁、16桁)と文字の種類(英字のみ、英数記号混在)ごとに表形式でシミュレーションしてください。
- Django(Python)やLaravel(PHP)などのフレームワークに標準搭載されている「ログイン回数制限(Throttling / Rate Limiting)」の設定方法を教えてください。
- ハッカーが盗み出したパスワードデータベースのハッシュ値を、超高速で総当たり解析する「オフライン・ブルートフォース攻撃」の仕組みと、その対策としての「ソルト(Salt)」および「ストレッチング」の重要性を教えてください。
- AIに「Firebase AuthやSupabaseを使ったログイン機能で、ブルートフォース攻撃や不正ログインを防ぐためのセキュリティ設定」を教えてもらいましょう。
- パスワード認証に代わる、ブルートフォース攻撃が物理的に不可能になる最新のセキュリティ認証技術(パスキーなど)について詳しく解説してください。