チェックサムとは?MD5、SHA-1、SHA-256を解説
チェックサムはファイルが改ざんや破損を受けていないかを確認するための短いフィンガープリントです。どのハッシュアルゴリズムを使用すべきか、そしてなぜMD5では不十分なのかを理解することで、一般的なセキュリティ上のミスを防ぐことができます。
チェックサムとは?
チェックサムは、データをハッシュ関数に通すことで生成される固定長の文字列です。チェックサムは指紋のような役割を果たします。元のデータのたった1ビットでも変化すれば、チェックサムは完全に変わります。この性質により、チェックサムは以下の2つの用途で非常に有用です:
- 整合性の検証 — このファイルは破損や改ざんなく届いたか?
- 同一性の確認 — この正確なファイル(またはデータの一部)は、別のコピーと同じものか?
公式サイトからソフトウェアをダウンロードする際、ダウンロードページにはよくMD5やSHA-256のハッシュが表示されています。ダウンロード後、ローカルファイルのハッシュを計算して比較します。一致していれば、ファイルは無傷です。
ハッシュ関数の仕組み
暗号学的ハッシュ関数は、任意の長さの入力を受け取り、固定長のダイジェストを出力します。優れたハッシュ関数には以下の4つの特性があります:
- 決定論的(Deterministic) — 同じ入力に対して常に同じ出力を生成する
- 一方向性(One-way) — ハッシュから元の入力を逆算することはできない(妥当な時間内において)
- 雪崩効果(Avalanche effect) — 入力の1文字を変更すると、出力ビットの約半分が変わる
- 衝突耐性(Collision-resistant) — 同じハッシュを生成する異なる2つの入力を見つけることが計算上不可能であること
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824SHA-256("Hello") = 185f8db32921bd46d35e3a1a4e9a9b9c6a7e6a7d2d2c4e9d... (完全に異なる)
MD5 — 高速で馴染みがあるが、セキュリティには不適切
MD5 (Message Digest Algorithm 5) は128ビット(32文字のhex)のダイジェストを生成します。1991年に設計され、約20年間にわたりインターネット上のデフォルトのチェックサムアルゴリズムとなりました。
MD5がまだ許容されるケース:
- 非セキュリティの整合性チェック — 大容量ファイルの転送中に破損が発生しなかったかを確認する場合
- 重複排除 — 2つのファイルが同一であるかを確認する場合(バイト単位の比較の前の高速な事前チェックとして)
- 衝突攻撃が懸念されないキャッシュキーやETags
MD5が許容されないケース:
- パスワードの保存 — MD5は非常に高速であるため、GPUを使用したブルートフォース攻撃が容易です。消費者向けハードウェアで毎秒数十億件のMD5ハッシュを算出することが可能です。
- デジタル署名 — MD5の衝突攻撃は実証されています。異なる2つのファイルを用意して、同じMD5ハッシュを持つように構成することが可能です。
- 証明書の指紋(フィンガープリント) — 同じ衝突の問題が適用されます。
md5($password) を見つけた場合は、PHPなら password_hash() に、その他の言語なら bcrypt/Argon2 に置き換えてください。MD5はパスワードハッシュアルゴリズムではありません。それは遅くなるように設計されたことのないものであり、パスワードハッシュの安全性は「遅さ」によって担保されるのです。
SHA-1 — 非推奨(Deprecated)
SHA-1は160ビット(40文字のhex)のダイジェストを生成します。1990年代後半にMD5に代わる推奨アルゴリズムとして採用され、SSL/TLS証明書、バージョン管理システム、ファイルの整合性チェックなどで広く利用されてきました。
2017年、GoogleのProject Zeroチームが最初の実用的なSHA-1衝突("SHAttered"攻撃)を実証しました。これには約6,500 CPU年相当の計算が必要でした。主要なブラウザや証明書発行機関は、2017年にSHA-1証明書の受け入れを停止しました。Gitは依然として内部でコミットハッシュにSHA-1を使用していますが、オプションの代替としてSHA-256への移行を進めています。
新しいアプリケーションでは、SHA-1を使用しないでください。代わりにSHA-256またはSHA-512を使用してください。
SHA-256 — 現在の標準
SHA-256はNSAによって設計され、2001年に公開されたSHA-2ファミリーの一部です。256ビット(64文字のhex)のダイジェストを生成します。今日まで、SHA-256に対する実用的な衝突攻撃は存在していません。
SHA-256の使用例:
- ファイルの整合性検証(ソフトウェアのダウンロード、バックアップ)
- デジタル署名(TLS証明書、コード署名)
- HMACベースの認証トークン(HMAC-SHA256)
- ブロックチェーンおよび暗号資産(BitcoinはダブルSHA-256を使用)
- SHA-256モードのGitコミットハッシュ
- HS256またはRS256を使用する際のJWT (JSON Web Token) 署名
SHA-256は、安全なハッシュを必要とするほぼすべてのアプリケーションにおいて正しいデフォルトです。迷ったらSHA-256を使用してください。
SHA-512 — より大きなサイズが必要な場合
SHA-512は512ビット(128文字のhex)のダイジェストを生成します。同じSHA-2ファミリーの一部であり、同等の安全性を持っています。主な実用的な違いは以下の通りです:
- 64ビットプロセッサでは、アルゴリズムが64ビットワードサイズに最適化されているため、SHA-512の方が実際に速い場合があります
- 32ビットシステムおよびハードウェアでは、SHA-256の方が高速です
- SHA-512は出力が大きいため、保存や転送のサイズが長くなります
アプリケーションがより大きなダイジェストを必要とする場合や、SHA-512がパフォーマンス上の利点を持つハードウェアを使用している場合にSHA-512を使用してください。ほとんどのWebアプリケーションでは、SHA-256で十分です。
パスワードハッシュに関する注意点
上記のアルゴリズムはいずれも、パスワード保存に直接使用すべきではありません。MD5、SHA-1、SHA-256、およびSHA-512はすべて高速に動作するように設計されていますが、パスワードに関しては「高速」であることは正反対の事です。
パスワードハッシュは、盗まれたデータベースをすぐに解析されないよう、意図的に遅くなる必要があります。専用に設計されたパスワードハッシュアルゴリズムを使用してください:
- bcrypt — 20年以上にわたり標準となっており、事実上すべての言語でサポートされています
- Argon2(特にArgon2id) — Password Hashing Competition (2015) の勝者であり、新しいアプリケーションに推奨されます
- scrypt — メモリハードなアルゴリズムで、これも強力な選択肢です
PHPの場合:password_hash($password, PASSWORD_ARGON2ID)。Node.jsの場合:bcryptjs または argon2 パッケージを使用してください。これらはソルトの生成やワーク係数の調整を自動的に処理します。
ファイルのチェックサムを確認する方法
ソフトウェアをダウンロードし、サイトがSHA-256ハッシュを提供している場合:
shasum -a 256 downloaded-file.zip
# 出力と公式のハッシュを比較する
Windows (PowerShell)の場合:
Get-FileHash downloaded-file.zip -Algorithm SHA256
または、当社のHash Generatorを使用して、ファイルの内容やテキストを貼り付けてMD5、SHA-1、SHA-256、またはSHA-512のハッシュを直接ブラウザで計算できます。データはサーバーに送信されません。
MD5、SHA-256などを生成する
ブラウザ上でテキストやファイルの内容から任意のハッシュ(MD5、SHA-1、SHA-256、SHA-512)を計算できます。アップロード不要、サーバーへの送信もありません。