「パスワードはハッシュ化して保存しなさい、と言われたけれど、そもそもハッシュって何が起きているのか分からない」「SHA-256とMD5はどう違うのか、結局どれを使えばいいのか判断できない」――現場で運用ツールやWebアプリの開発・保守をしていると、こうした疑問にぶつかります。ハッシュ関数はセキュリティ実装の根幹にある仕組みでありながら、用語が抽象的で、学習教材も数式寄りになりがちです。
この記事では、ハッシュ関数の仕組み・代表的なアルゴリズム・パスワード保存への正しい使い方を、現場のエンジニアが実装判断できるレベルで解説します。MD5の何が問題なのか、bcryptとSHA-256のどちらをパスワード保存に使うべきか、ソルトとストレッチングは何が違うのか――こうした実務直結の論点を1本にまとめました。
ハッシュ関数とは?(概要と「なぜ重要か」)
ハッシュ関数(hash function)とは、任意の長さの入力データを、固定長の短いビット列(ハッシュ値、メッセージダイジェスト)に変換する数学的な関数のことです。たとえばSHA-256というハッシュ関数に「password」という8文字の文字列を入力しても、1MBの画像ファイルを入力しても、出力は必ず256ビット(64文字の16進数)の固定長になります。
セキュリティの世界でハッシュ関数が重要なのは、暗号化(encryption)とは異なる、独自の役割を担っているからです。暗号化は「鍵を使って復号できる変換」ですが、ハッシュは「復号できない一方向の変換」です。この性質が、改ざん検知・パスワード保存・電子署名といった現代のセキュリティ実装を支えています。
身近な例で言えば、Linuxのパッケージ配布で「sha256sum」が併記されているのも、Gitのコミットハッシュも、Bitcoinのブロックハッシュも、すべて同じハッシュ関数の応用です。仕組みを正しく理解すれば、こうした技術が「同じ原理の別の用途」だと見通しが効くようになります。
ハッシュ関数が満たすべき3つの性質
セキュリティ用途で使えるハッシュ関数(暗号学的ハッシュ関数)は、次の3つの性質を満たします。
1. 一方向性(preimage resistance)
ハッシュ値から元の入力を逆算するのが極めて困難であるという性質です。SHA-256で「a3f5b2…」というハッシュ値が得られたとき、その元の入力が何だったかを計算で求めることは現実的な時間ではできません。総当たり(ブルートフォース)で試すしかなく、256ビットの探索空間は宇宙の年齢を超える時間が必要とされる規模です。
2. 衝突耐性(collision resistance)
異なる2つの入力から同じハッシュ値が生成されてしまうのを「衝突(collision)」と呼びます。暗号学的ハッシュ関数は、現実的な計算量では衝突を見つけられないことが要件です。衝突が容易に作れるハッシュは、後述するとおりMD5やSHA-1のように事実上「破られた」と判定され、新規用途では使用しません。
3. 雪崩効果(avalanche effect)
入力を1ビットだけ変えても、出力のハッシュ値は半分以上のビットが変わる、という性質です。たとえば「password」と「Password」では、見た目は1文字違いですが、SHA-256ハッシュは全く別物に見える値になります。この性質により、ハッシュ値からの「似た入力推定」が困難になります。
代表的なハッシュアルゴリズムの違い
ハッシュ関数にはいくつかの世代があり、それぞれセキュリティ強度と用途が異なります。
| アルゴリズム | 出力長 | 登場年 | 現在の評価 | 用途の目安 |
|---|---|---|---|---|
| MD5 | 128ビット | 1992年 | 破られている(衝突容易) | セキュリティ用途では使用禁止。チェックサム用途のみ |
| SHA-1 | 160ビット | 1995年 | 破られている(衝突実証済み) | 新規用途では使用禁止。レガシー互換のみ |
| SHA-256(SHA-2系) | 256ビット | 2001年 | 現役の標準 | 整合性チェック、電子署名、TLS、ブロックチェーン |
| SHA-512(SHA-2系) | 512ビット | 2001年 | 現役の標準 | SHA-256と同等用途。64ビット環境で高速 |
| SHA-3 | 可変(224/256/384/512) | 2015年 | 標準採用済み | SHA-2の代替・併用。設計思想が異なる |
| bcrypt | 192ビット | 1999年 | パスワード保存の現役標準 | パスワードハッシュ専用(ソルト・ストレッチ内蔵) |
| Argon2 | 可変 | 2015年 | パスワードハッシュの最新標準 | パスワード保存(PHC優勝アルゴリズム) |
MD5は2004年に中国の研究者によって衝突攻撃が実証され、SHA-1も2017年にGoogleが現実的計算量での衝突生成に成功しました(SHAttered攻撃)。これらは「壊れた」アルゴリズムとして、新規システムでセキュリティ目的に使うべきではありません。一方でMD5は、ネットワーク経由でダウンロードしたファイルの「うっかり破損」検知のような、改ざん耐性を要求しない用途では今も使われ続けています。
ハッシュ関数の主な用途
1. ファイル整合性チェック(改ざん検知)
LinuxディストリビューションのISOファイル配布や、ソフトウェアの公式バイナリ配布で「SHA-256ハッシュ値」が併記されているのは、ダウンロードしたファイルが配布元と同一かを確認するためです。手元で計算したハッシュ値と配布元の値が一致すれば、転送経路での破損や中間者攻撃による差し替えが行われていないと判断できます。
# Linuxでファイルのハッシュ値を計算する $ sha256sum ubuntu-24.04.iso # 出力例 # a3f5b2c8e1d4... ubuntu-24.04.iso # 配布元の公開ハッシュ値と一致するか目視で確認 # 自動化する場合は sha256sum -c で照合
2. 電子署名・デジタル署名
電子署名は「メッセージのハッシュ値を、秘密鍵で暗号化したもの」です。長いメッセージそのものではなく、固定長のハッシュ値に署名することで、計算コストを抑えながらメッセージの真正性と完全性を保証します。TLS証明書、ソフトウェアの署名、PDFの電子署名など、現代のPKI(公開鍵基盤)はハッシュ関数とセットで動作しています。
3. パスワード保存
ユーザーのパスワードを平文でデータベースに保存すると、データベース漏洩が即座に全アカウント乗っ取りにつながります。そこでハッシュ化して保存し、ログイン時には入力されたパスワードを同じ方法でハッシュ化し、保存値と比較することで認証する仕組みが標準です。ただし、この用途で使うハッシュには専用の追加対策が必要で、後述します。
4. データ構造・分散システム
ハッシュテーブル、Bloomフィルター、分散ハッシュテーブル(DHT)、ブロックチェーンなど、ハッシュ関数はデータ構造や分散システムの基礎にも使われます。これらはセキュリティが主目的ではない場合もありますが、原理は同じです。
パスワード保存でのハッシュ活用(実装の正解)
「パスワードはハッシュ化すればよい」と言われますが、実はSHA-256をそのまま使うのは推奨されません。理由は3つあります。
1. レインボーテーブル攻撃への耐性が必要
レインボーテーブルとは、よく使われるパスワードとそのハッシュ値の対応表を事前に大量計算しておき、漏洩したハッシュから元のパスワードを高速逆引きする攻撃手法です。SHA-256単体のハッシュは決定的なので、同じパスワードからは常に同じハッシュが出ます。これでは事前計算で破られます。
対策: ソルト(salt)
ユーザーごとにランダムな文字列(ソルト)を生成し、パスワードと連結してからハッシュ化します。これにより、同じパスワードでもユーザーごとに異なるハッシュ値となり、レインボーテーブルが事実上使えなくなります。
2. 計算コストを意図的に高くする必要がある
SHA-256は意図的に「高速に計算できる」ように設計されています。これは整合性チェックには都合がいいですが、パスワード保存では逆効果です。攻撃者がGPUで毎秒数十億回のハッシュ計算を仕掛けてくる時代に、高速ハッシュは「ブルートフォースしてください」と言っているようなものです。
対策: ストレッチング(key stretching)
ハッシュ計算を意図的に何万回も繰り返すことで、1回の照合に数十~数百ミリ秒かかるようにします。正規ログインでは体感できない遅延ですが、攻撃者の総当たりは現実的時間で完了しないコストに引き上げられます。
3. 結論: bcryptかArgon2を使う
ソルトとストレッチングを自前で実装するのは事故のもとなので、これらを内蔵した専用のパスワードハッシュアルゴリズムを使うのが正解です。
・bcrypt: 1999年登場、20年以上の実戦運用実績。PHP・Ruby・Node.js・Pythonなど主要言語で標準提供。
・Argon2: 2015年のPassword Hashing Competition(PHC)優勝アルゴリズム。メモリ使用量も調整可能で、GPU/ASIC攻撃への耐性が高い。新規実装で選べるならArgon2id推奨。
・scrypt・PBKDF2: bcrypt/Argon2と並ぶ選択肢。PBKDF2はFIPS準拠が必要な環境で使われる。
中小企業でも今日からできること
情シス1人体制でも、ハッシュに関して押さえておきたい実務ポイントは次のとおりです。
1. 自社Webアプリのパスワード保存方式を確認する
社内システム・顧客向けWebアプリのパスワードが、MD5・SHA-1・素のSHA-256で保存されていないかを開発ベンダーや内製チームに確認します。レガシー実装が残っている場合、ログイン成功時にbcrypt/Argon2へ段階的に再ハッシュする「アップグレード移行」が標準パターンです。
2. ファイル配布時はSHA-256ハッシュを併記する
社内に配布するスクリプト・ツール・設定ファイルにはSHA-256ハッシュ値を併記し、受け取り側で `sha256sum -c` で照合する運用を徹底します。これだけでも、社内ファイルサーバー経由の改ざんやメール添付の偽装に気づける可能性が上がります。
3. レガシーアルゴリズムの棚卸し
社内システムでMD5・SHA-1を使っている箇所を棚卸しします。SSL/TLS証明書、Apache/NginxのDigest認証、独自開発のトークン生成――こうした箇所が現役のMD5・SHA-1依存だと、長期的なリスクになります。
4. 標準ツール・ライブラリを使う
ハッシュは自前実装しません。OS標準のコマンド(sha256sum、openssl dgst)、言語標準のライブラリ(PythonのhashlibやPHPのpassword_hash)、信頼できるOSSを使えば、実装ミスのリスクをほぼゼロにできます。
よくある誤解と注意点
誤解1: 「ハッシュ化=暗号化」と思っている
ハッシュは一方向の変換で、復号できません。暗号化(AES・RSAなど)は鍵で元に戻せる双方向変換です。「データを保護したい」のか「同一性を確認したい」のかで使い分けます。
誤解2: 「SHA-256を使えばパスワード保存は安全」と思っている
前述のとおり、SHA-256単体は高速すぎてパスワード保存には不向きです。ソルト+ストレッチング、もしくはbcrypt/Argon2を使います。
誤解3: 「MD5でも破られにくいパスワードなら問題ない」と思っている
ユーザーが弱いパスワード(「password123」など)を選ぶ可能性は常にあります。アルゴリズムの強度はユーザーの行動を補正できる「最後の砦」です。弱いアルゴリズムを残す理由にはなりません。
誤解4: 「ハッシュは100%安全」と思っている
暗号学的ハッシュ関数は「現在の計算能力では破れない」というレベルの安全性であって、未来の量子コンピュータや新しい攻撃手法によって変わり得ます。だからこそ、業界全体で定期的にアルゴリズム更新(MD5→SHA-1→SHA-2)が進められています。
誤解5: 「ソルトは秘密にすべき」と思っている
ソルトはレインボーテーブルを無効化するための仕組みで、秘密情報ではありません。ハッシュ値と一緒にデータベースに保存し、認証時に読み出して使うのが標準的な実装です。秘密にすべきは「ペッパー(pepper)」と呼ばれる別の追加要素で、これは混同しないようにします。
ITマスターシリーズの関連知識
ハッシュ関数を実際にLinuxで扱う際のコマンド(sha256sum、openssl、md5sum)の使い方や、ファイル整合性監視(AIDE)の実装は、姉妹サイトLinuxMaster.JPでも詳しく解説しています。クラウド環境でのKMS(鍵管理サービス)との組み合わせはCloudMaster.JPを参照すると、運用視点が補完できます。
本記事のまとめ
ハッシュ関数は、入力データを固定長のビット列に変換する一方向の数学関数で、改ざん検知・電子署名・パスワード保存・分散システムなど、現代のセキュリティ実装の根幹を担います。重要なポイントは次の4つです。
・用途で選ぶ: 整合性チェック・電子署名にはSHA-256/SHA-3。パスワード保存にはbcryptかArgon2。
・MD5・SHA-1は使わない: 衝突攻撃が実証されており、新規セキュリティ用途では避ける。
・パスワード保存は専用アルゴリズム: SHA-256を直接使わず、ソルトとストレッチングを内蔵したbcrypt・Argon2を選ぶ。
・自前実装しない: 標準ライブラリ・OS標準コマンドを使い、車輪の再発明を避ける。
ハッシュ関数は、仕組みを正しく理解すれば「同じ原理がさまざまな技術の土台」だと見通しが利く、応用範囲の広い基礎概念です。社内システムのパスワード保存方式や、ファイル配布フローを今日見直すだけでも、実務レベルのセキュリティ強化につながります。
ハッシュ関数を含む暗号技術を、現場で使えるレベルで身につけたい方へ
パスワード保存・電子署名・TLS――暗号技術は知っているつもりでも、いざ実装判断を求められると迷う領域です。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。
