UnsplashのallPhoto Bangkokが撮影した写真
ハッシュ関数は、パスワード保管、改ざん検知、デジタル署名など、情報セキュリティの土台として広く使われています。ところが、ハッシュの使い方やアルゴリズム選定を誤ると、ハッシュ値から元データを探し出す「原像攻撃(Preimage Attack)」の影響を受け、認証突破や情報漏洩、改ざんの見逃しにつながる恐れがあります。この記事では、原像攻撃の意味と誤解されやすいポイントを整理した上で、実務で実装しやすい防御策(アルゴリズム選定・運用・移行)までを具体的に解説します。
原像攻撃(Preimage Attack)とは、あるハッシュ値 h が与えられたときに、それを生成する入力 m(原像)を見つけようとする攻撃です。ハッシュ関数は本来「一方向(戻せない)」であることが前提ですが、出力長が短すぎる、古い設計、実装上の弱点、運用上の不備などが重なると、攻撃者が現実的なコストで入力を突き止められる場面が生まれます。
なお、現場では「ハッシュが割れる=原像攻撃」と一括りにされがちですが、厳密には状況が分かれます。たとえば、パスワードハッシュの“解読”は、攻撃者が辞書・総当たりで候補を試し、ハッシュが一致する入力を探す(結果として原像が見つかる)という意味で、原像攻撃と近い挙動になります。一方で、デジタル署名や改ざん検知で問題になるのは、原像攻撃だけでなく、別の性質(後述)であることも多い点に注意が必要です。
原像攻撃は、与えられたハッシュ値に対応する入力(元のメッセージ)を見つけ出すことを目的とした攻撃です。一般に、理想的なハッシュ関数で出力が n ビットなら、原像を見つけるには概ね 2n 回規模の試行が必要とされ、十分な n(例:256ビット)が確保されていれば現実的に破られにくい、と考えられています。
ただし、ここでいう「元のメッセージ」は“唯一の正解”とは限りません。ハッシュは多対一なので、同じハッシュ値を返す入力は理論上複数存在し得ます。攻撃の成功条件は、システム側が受け入れてしまう入力を1つでも見つけることです(例:パスワード照合で一致する入力、APIトークン照合で一致する入力など)。
原像攻撃の基本的な進み方は次の通りです。
ここで重要なのは、「ハッシュ関数の数学的な弱点」がなくても、運用の弱さで成立してしまう点です。たとえば、入力(パスワード)が短い・単純で候補空間が狭い、ソルトがない、ストレッチング(遅延化)がない、といった状況では、攻撃者は“ハッシュ自体を破った”というより、入力の弱さを突いて一致を見つけます。
原像攻撃が現実的になる要因は、大きく分けて「アルゴリズム」「出力長」「運用」の3つです。ここで、原稿に混ざりやすい誤解も合わせて整理します。
一方で、次のような説明は誤解を招きやすいため注意が必要です。
ハッシュ攻撃は似た言葉が多いため、ここで整理します。防御策の選び間違いを防ぐためにも、最低限の区別は押さえておくと安全です。
| 用語 | 狙い | 典型的に影響が出る場面 |
|---|---|---|
| 原像攻撃(Preimage) | 与えられたハッシュ値に一致する入力を見つける | パスワード照合、トークン照合、ハッシュのみで検証する仕組み |
| 第二原像攻撃(Second Preimage) | 与えられた入力 m と同じハッシュになる別入力 m' を見つける | 既存データを別内容に“すり替える”改ざん |
| 衝突攻撃(Collision) | 同じハッシュになる2つの入力の組を見つける(任意) | 署名・証明書・配布物の信頼性(用途によって深刻) |
「データ改ざん」と結びつける場合、多くのケースで論点は“第二原像”や“衝突”の方が直接的です。原像攻撃だけで改ざんが成立するのは、「ハッシュ値だけが正で、元データが検証されない」「照合に使う入力側を攻撃者が自由に選べる」など、運用が不適切な場合に限られます。
原像攻撃は「ハッシュが使われているなら何でも危険」という話ではなく、“ハッシュの使い方”によってリスクが大きく変わります。現場で遭遇しやすい代表例を押さえておくと、対策の優先順位が付けやすくなります。
もっとも典型的なのが、漏洩したパスワードハッシュに対する探索(辞書・総当たり)です。特に、ソルトなし、または速い一般ハッシュ(SHA-256等)をそのまま使っている場合、攻撃者はGPU等で高速に候補を試せます。逆に、Argon2・bcrypt・scryptのようなパスワード専用の遅い関数を使い、各ユーザーに一意なソルトを付けていれば、攻撃コストは大きく上がります。
APIキーやセッション・リカバリ用トークンを平文で保存せず、ハッシュ化して保存する設計は一般的です。ただし、トークンが短い、生成規則が推測可能、照合APIにレート制限がない、といった条件が揃うと、攻撃者が照合を繰り返して一致を探す余地が生まれます。ハッシュ化保存は有効ですが、トークン自体の強度(十分なランダム性と長さ)と照合のレート制御がセットです。
「ファイルのハッシュ値を公開しておき、同じなら正しい」という設計は、配布元が正しく保護されている前提では役立ちます。しかし、攻撃者がハッシュ値の配布経路を改ざんできるなら、検証は形骸化します。さらに、改ざん検知を本気で担保するなら、鍵付きの仕組み(HMAC)やデジタル署名が必要です。ここを“ただのハッシュ”で済ませると、攻撃モデルによっては守りになりません。
原像攻撃が成功すると、認証突破や機密情報の推測、検証機構の形骸化といった形で被害が発生します。ただし、危険性の語り方は「原像攻撃そのものが何を可能にするか」と「関連する性質(衝突等)がどんな被害を生むか」を分けて説明すると、誤解が減ります。
パスワードハッシュが漏洩し、攻撃者が一致する原像(パスワード)を見つければ、正規ユーザーとしてログインできる可能性があります。特に、同じパスワードを他サービスで使い回している場合、被害は連鎖します。管理者権限が奪われると、設定改変、ログ消去、横展開など、影響は急拡大し得ます。
ここでの本質は、ハッシュ関数の数学的弱点だけではありません。入力(パスワード)の弱さ、保存方式(速いハッシュ)、追加防御(MFAやレート制限)の欠如が重なると、現実的に破られやすくなります。
システムが「機密情報をハッシュ化して保存している」場合でも、その機密情報自体が短い・候補が少ない(例:社員番号のように範囲が狭い識別子)と、攻撃者は候補を総当たりして一致を探せます。ハッシュは暗号化ではないため、候補空間が小さいデータの秘匿には向きません。必要に応じて暗号化やアクセス制御と組み合わせる必要があります。
「ハッシュの衝突によってデジタル署名の信頼性が失われる」といった影響は、主に衝突攻撃(Collision)の領域です。原像攻撃と同一視すると、防御の選択を誤りやすくなります。
実務上は、次のように整理すると判断しやすくなります。
SHA-256やSHA-3のように、現代の推奨構成で十分な出力長を持つハッシュ関数に対して、純粋な原像攻撃を現実的なコストで成功させるのは一般に困難とされています。一方で、現場で問題になるのは、次のような“運用・設計の隙”です。
つまり、脅威レベルは「ハッシュ関数そのもの」だけでは決まらず、使い方と前提条件で大きく変わります。
原像攻撃への対策は、アルゴリズム選定だけでなく、用途に応じた“正しい使い方”を採用し、移行と運用まで含めて整えることがポイントです。ここでは、実務で実装しやすい順に整理します。
改ざん検知や識別子生成など一般用途のハッシュでは、SHA-2(例:SHA-256)やSHA-3など、推奨される現代的なアルゴリズムを採用し、十分な出力長を確保します。MD5やSHA-1は、用途によっては安全性不足が指摘されており、原則として新規採用は避け、計画的に移行するのが安全です。
ただし、ここで注意が必要です。パスワード保管において「SHA-256だから安全」という判断は危険です。パスワードは入力の候補空間が小さくなりがちで、かつ攻撃者は高速計算できる環境を持てるため、一般ハッシュをそのまま使うと“速すぎて”破られやすくなります。
パスワード保管では、Argon2(例:Argon2id)、bcrypt、scryptなど、パスワード向けに設計された方式を使います。これらは計算を意図的に重くし、攻撃者の総当たりを難しくします。加えて、次の条件を満たすと現実的な耐性が上がります。
このセットにより、漏洩後のオフライン攻撃(ハッシュの総当たり)と、オンライン攻撃(ログイン試行)双方に強くなります。
ソルトは、ハッシュ化する前に入力に付加するランダムな値です。ソルトを使用することで、同じ入力でも異なるハッシュ値が生成されるため、辞書攻撃やレインボーテーブルが効きにくくなります。特にパスワードでは必須に近い対策です。
ここでの注意点は、ソルトは「秘密である必要はない」一方で、「固定してはいけない」点です。全ユーザー共通の固定ソルトは、攻撃者が一度表を作れば再利用できてしまうため、防御効果が大きく下がります。
改ざん検知やメッセージの正当性確認を行いたい場合、単なるハッシュではなく、鍵付きハッシュ(HMAC)などの方式が適しています。HMACでは攻撃者が鍵を知らない限り正しい値を作れないため、“ハッシュを真似する”タイプの攻撃に強くなります。
この場合に重要なのが鍵管理です。鍵の漏洩が起きれば安全性が崩れるため、アクセス制御、保管場所の分離、監査、必要に応じた鍵更新(ローテーション)を運用として整備します。原稿内の「鍵の定期的な更新」は、原像攻撃の一般論というより、鍵付き方式(HMAC等)を採用した場合の運用論として位置づけると誤解が減ります。
古いハッシュから新方式へ移行する際は、「すべてを一度に置き換える」より、段階移行が現実的です。例えばパスワードなら、ログイン成功時に新方式へ再ハッシュして更新する、トークンなら新旧を一定期間併存させる、といった方法があります。
移行では次の点が落とし穴になりやすいです。
方式の棚卸し(どこで何が使われているか)を最初に行い、撤去期限と担当を明確にして進めるのが安全です。
ハッシュ関数の理論だけでなく、実装上の問題(ライブラリの脆弱性、設定ミス、脆弱な乱数生成、ログへの機密値出力など)が事故の原因になることがあります。定期的に依存ライブラリを更新し、セキュリティ情報を監視し、必要なパッチを速やかに適用できる体制を整えます。
また、実装の安全性を上げるには「自作しない」ことも大切です。暗号・ハッシュは、枯れたライブラリと推奨設定を使い、レビューとテストで確認するのが現実的です。
原像攻撃は、与えられたハッシュ値に一致する入力(原像)を見つけようとする攻撃で、認証突破や機密情報の推測などにつながります。ただし、現場でのリスクは「ハッシュ関数が弱いから」だけではなく、古い方式の放置、パスワード保管での設計ミス(速いハッシュの利用、ソルト不備)、照合APIの運用不備(レート制限なし)など、使い方の問題で顕在化しやすい点が重要です。用途に応じて、一般用途はSHA-2/SHA-3、パスワードはArgon2/bcrypt/scrypt、改ざん検知はHMACや署名、と使い分け、移行と運用まで含めて整えることが、原像攻撃を含むハッシュ関連リスクの現実的な低減につながります。
与えられたハッシュ値に一致する入力(元データ)を見つけようとする攻撃です。
別物です。原像は「ハッシュから入力を探す」、衝突は「同じハッシュになる2入力の組を作る」攻撃です。
必ずではありませんが、現代の脅威モデルでは避けるべき用途が多く、計画的な移行が推奨されます。
十分ではありません。パスワードはArgon2やbcryptなどの専用方式とソルトを使うのが基本です。
秘密である必要はありませんが、ユーザーごとに一意でランダムである必要があります。
ハッシュが漏洩しても追加の秘密がないと総当たりが進みにくくなり、防御が一段強くなります。
攻撃モデルによっては不十分です。改ざん検知にはHMACやデジタル署名が適しています。
短く推測しやすい入力(弱いパスワード、範囲が狭い識別子、短いトークン)をハッシュ化している場合です。
旧方式からの移行、認証基盤の改修、鍵管理の整備、監査・レビュー体制の構築です。
どこでどのハッシュ方式を使っているか棚卸しし、パスワードが専用方式か、ソルトが一意か、旧方式が残っていないかを確認します。