ハッシュ関数とは?
「ハッシュ関数」とは、入力されたデータ(テキストやファイルなど)を、特定の長さの不規則な文字列(ハッシュ値)に変換する計算式のことです。 ハッシュ関数には、以下の重要な性質があります。
- 一方向性:ハッシュ値から元のデータを復元することは、計算上不可能である。
- 決定論的:同じ入力データからは、常に全く同じハッシュ値が生成される。
- 衝突耐性:異なる入力データから同じハッシュ値が生成される(衝突する)確率が極めて低い。
- 雪崩効果:入力データが1文字でも変わると、生成されるハッシュ値は全く異なるものになる。
しかし、一言で「ハッシュ化」と言っても、アルゴリズムごとにその目的や計算速度は大きく異なります。用途を間違えると重大なセキュリティ脆弱性につながるため、正しい知識に基づく使い分けが必要です。
高速ハッシュ vs 低速ハッシュ(最も重要な概念)
ハッシュ関数を使い分ける上で、最も重要なのが**「計算速度」**の設計思想です。

高速ハッシュ(MD5, SHA-256, SHA-512 など)
大容量のファイルを高速に処理し、データが破損していないか(整合性)を検証する用途に向けて設計されています。 そのため、パスワードの保存に高速ハッシュを使ってはいけません。ハッシュの計算スピードが速すぎるため、ハッカーが強力なGPUや専用LSI(ASIC)を使って「1秒間に数億〜数千億回」の総当たり攻撃(ブルートフォース攻撃)やレインボーテーブル攻撃を行うと、短時間で元のパスワードが特定されてしまうためです。
低速ハッシュ(bcrypt など)
パスワードを安全に保存するために設計されたアルゴリズムです。 あえて計算処理に時間(ミリ秒単位)がかかるように作られており、計算の「重さ(コストファクター)」を調整できます。さらに、ハッシュ値の中にランダムな「ソルト(Salt)」を自動で埋め込むため、総当たり攻撃にかかる時間とコストを爆発的に引き上げ、パスワード漏洩時の安全性を極限まで高めます。
早見表
| アルゴリズム | 分類 | 計算速度 | 主な目的 | セキュリティ強度 |
|---|---|---|---|---|
| MD5 | 高速ハッシュ | 極めて高速 | 非セキュリティ用途(データ破損検知、レガシー互換) | 脆弱(衝突攻撃が容易、セキュリティ用途は不可) |
| SHA-256 | 高速ハッシュ | 高速 | データの整合性検証、デジタル署名、暗号通貨 | 強固(現在の標準的な暗号ハッシュ関数) |
| SHA-512 | 高速ハッシュ | 高速 | 高いセキュリティが要求される場面での整合性検証 | 極めて強固(SHA-256より長いハッシュ値) |
| bcrypt | 低速ハッシュ | 調整可能(低速) | パスワードの保存 | パスワード用途において最強クラス |
| HMAC | 鍵付き高速ハッシュ | 高速 | メッセージの改ざん検知・送信元の認証 | 強固(指定する内部ハッシュ関数に依存) |
| CRC16 / CRC32 | チェックサム | 爆速 | 通信エラーチェック、ファイルの簡易破損検出 | ゼロ(暗号学的性質を持たないため、改ざん防止力はない) |
各ハッシュ関数の詳細とユースケース
MD5:高速だが脆弱、破損チェックのみ
MD5(Message Digest Algorithm 5)は、1990年代に開発されたハッシュ関数です。入力データから128ビット(32文字の16進数)のハッシュ値を生成します。 現在では、異なるデータから同じハッシュ値を意図的に作り出す「衝突攻撃」の手法が確立されているため、パスワードのハッシュ化やデジタル署名などのセキュリティ用途に使用してはなりません。 現在は、ファイルのダウンロード時にファイルが途中で破損していないか確認する「チェックサム」や、重複データの簡易チェックなどの用途に限られます。
SHA-256 & SHA-512:業界標準の暗号学的高速ハッシュ
SHA-2ファミリーに属するアルゴリズムで、現在のIT業界で最も広く使われている暗号学的ハッシュ関数です。 SHA-256は256ビット(64文字)、SHA-512は512ビット(128文字)のハッシュ値を返します。現在も実用的な衝突攻撃手法は見つかっておらず、極めて安全です。
- SHA-256: SSL/TLS証明書、Gitのコミット管理、ビットコインなどの暗号通貨、各種データのデジタル署名に広く使われています。
- SHA-512: 64ビットCPUの環境下では、内部のデータ処理単位が一致するため、SHA-256よりも高速に処理できる場合があります。より高いセキュリティ強度や長大なハッシュ値が必要な場面で選択されます。
bcrypt:パスワード保存の決定版
bcryptは、パスワードハッシュ化専用に設計された低速ハッシュアルゴリズムです。 「コストファクター(ストレッチング回数)」を設定でき、ハッシュ生成を意図的に引き延ばすことで攻撃者の総当たり効率を激減させます。
最大の特徴は、**「同じパスワードを入力しても毎回ハッシュ値が変わる」**点です。これは内部でランダムな「ソルト(Salt)」が自動生成され、ハッシュ文字列の先頭部分に格納される仕組みになっているためです。検証の際は、保存されているbcryptハッシュからソルトを取り出して同じアルゴリズムでパスワードを再計算し、一致するか確認します。
HMAC:鍵を持った改ざん防止ハッシュ
HMAC(Hash-based Message Authentication Code)は、送信データと「秘密鍵(シークレットキー)」を組み合わせてハッシュ値を計算するメッセージ認証コードです。 同じデータであっても、鍵が異なればハッシュ値は変わります。データの改ざんを防ぐだけでなく、「正しい秘密鍵を持っている送信者が送ったものか」という送信元認証も同時に行えるため、APIの認証(AWSのAPI署名など)や、外部からのWebhook(GitHubやStripeなど)の正当性検証に必須の技術です。
CRC16 / CRC32:ネットワーク・通信用のチェックサム
CRC(巡回冗長検査)は、厳密には暗号学的ハッシュ関数ではなく、単純なデータ破損を検知するための「チェックサム」です。 計算量が非常に少なく、CPUやハードウェアで超高速に処理できるため、イーサネットなどのネットワーク通信や、ZIP/PNGファイルのエラー検出に使用されています。暗号学的な衝突耐性はないため、悪意を持った第三者による改ざんを検知することはできません。
まとめ:使い分けのルール
- パスワードをDBに保存したい ➔ bcryptハッシュ生成 を使用する(コストは10〜12を推奨)。
- ファイルのダウンロード確認や破損の検知 ➔ SHA256ハッシュ生成 または SHA512ハッシュ生成 を使用する。
- APIやWebhookの送信元確認と改ざん検知 ➔ HMAC生成ツール を使用する。
- 通信の誤り制御やZIP・PNGなどの簡易破損検出 ➔ チェックサム計算ツール (CRC16/CRC32) を使用する。
- セキュリティが必要ない単純データ比較やレガシー互換 ➔ MD5ハッシュ生成 を使用する。