ファイルのダウンロードページで SHA-256: a3f9c2d1... のような文字列を見たことはないでしょうか。これは ハッシュ値(チェックサム) と呼ばれるもので、ファイルの整合性を確認するために使われています。
この記事では、ハッシュ関数の仕組みと主要なアルゴリズム(MD5・SHA-1・SHA-256・SHA-512)の違い、よくある使いどころと注意点を整理します。
ハッシュ関数とは
ハッシュ関数とは、任意の長さのデータを固定長の文字列(ハッシュ値)に変換する関数です。入力が1文字でも1GBのファイルでも、出力は常に同じ長さになります。
ハッシュ関数の重要な特性が2つあります。
- 一方向性: ハッシュ値から元のデータを復元することは(計算量的に)不可能
- 衝突困難性: 異なるデータから同じハッシュ値が生成される(衝突)確率が極めて低い
これにより、「ハッシュ値が一致すれば、元データも同じ」という検証が成り立ちます。
主要なハッシュアルゴリズムの比較
| アルゴリズム | 出力長 | 状態 | 主な用途 |
|---|---|---|---|
| MD5 | 128 bit(32文字) | 非推奨(セキュリティ用途) | ファイルのチェックサム、データ整合性 |
| SHA-1 | 160 bit(40文字) | 非推奨(セキュリティ用途) | Git のコミットハッシュ、レガシーシステム |
| SHA-256 | 256 bit(64文字) | 現在の標準 | デジタル署名、JWT、TLS 証明書 |
| SHA-512 | 512 bit(128文字) | 高セキュリティ向け | セキュリティ強度が特に求められる用途 |
同じ入力に対して各アルゴリズムで生成したハッシュ値の例(「hello」の場合):
MD5: 5d41402abc4b2a76b9719d911017c592
SHA-1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
よくある使いどころ
ファイルの整合性確認(チェックサム)
ダウンロードしたファイルが改ざん・破損していないかを確認するために使われます。配布元が公開しているハッシュ値とダウンロードしたファイルのハッシュ値を比較します。
# macOS / Linux でのハッシュ確認
shasum -a 256 downloaded-file.zip
# → a3f9c2d1... downloaded-file.zip
# 配布元の値と一致すれば改ざんなし
データベースへのデータ保存と重複チェック
同じ内容のファイルやデータを重複して保存しないよう、ハッシュ値をキーとして管理する手法があります(コンテントアドレッサブルストレージ)。Git のオブジェクト管理もこの仕組みを利用しています。
デジタル署名・TLS 証明書
SHA-256 は TLS(HTTPS)のサーバー証明書や電子署名の基盤として広く使われています。ドキュメントや通信の完全性を保証するために、ハッシュ値に対して署名が行われます。
JWT の署名(HMAC-SHA256)
JWT の署名アルゴリズム HS256 は、SHA-256 ベースの HMAC(Hash-based Message Authentication Code)です。ペイロードの改ざんを検出するために使われています。
パスワードにハッシュを使う場合の注意点
パスワードの保存に MD5 や SHA-256 を直接使ってはいけません。 これらの汎用ハッシュ関数は高速に計算できるため、レインボーテーブル攻撃やブルートフォース攻撃に弱いです。
パスワードのハッシュ化には、意図的に計算コストを高くした専用アルゴリズムを使ってください。
| アルゴリズム | 特徴 |
|---|---|
| bcrypt | コストファクター調整可能。広く実績あり |
| Argon2 | メモリ負荷型。現在のベストプラクティス |
| scrypt | メモリ&CPU 負荷型 |
| PBKDF2 | ストレッチング回数調整可能 |
MD5 や SHA-1 が「非推奨」な理由
MD5 と SHA-1 は、異なる入力から同じハッシュ値を生成する「衝突」が実際に発見されています。これにより、ファイルを改ざんしてもハッシュ値が変わらないケースが現実に起こり得ます。
ただし、ファイルの単純なチェックサム(転送エラーの確認など)のような非セキュリティ用途では、速度の優位性から今でも MD5 が使われているケースがあります。セキュリティが要件でなければ許容される場合もありますが、新規システムでは SHA-256 以上を選ぶのが無難です。
まとめ
- ハッシュ関数は任意のデータを固定長の値に変換する一方向の関数
- セキュリティ用途では SHA-256 以上が現在の標準。MD5・SHA-1 は非推奨
- ファイルのチェックサム、デジタル署名、JWT 署名など幅広く使われる
- パスワードの保存には汎用ハッシュは使わない。bcrypt・Argon2 などの専用アルゴリズムを使うこと