セキュリティ · 5分で読めます ·
MD5、SHA-1、SHA-256:どのハッシュを使うべき?
チェックサム、ファイルの整合性、パスワード、署名では、必要なものがそれぞれ違います。正しいハッシュの選び方と、絶対に避けたいミスを短く解説します。

ハッシュ関数は、どんな入力も固定長の短い「指紋」に変えます。同じ入力からは必ず同じハッシュが得られ、1バイト変えるだけで結果はまったく別物になります。アルゴリズムの違いは、だますのがどれだけ難しいかです。
"hello" MD5 5d41402abc4b2a76b9719d911017c592
"hello" SHA-256 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
MD5とSHA-1:セキュリティ用途では破られている
同じMD5ハッシュを持つ2つの異なる入力は数秒で作れますし、SHA-1の実用的な衝突も2017年に公開されています。署名や証明書など、攻撃者が改ざんしうるものには使わないでください。重複ファイルの検出やキャッシュキーの作成といった、手早いチェックサムとしてはまだ使えます。
SHA-256:安全な標準
整合性チェック、ダウンロードの検証、デジタル署名、内容によるアドレス指定には、SHA-2ファミリーのSHA-256が標準的な選択です。SHA-3やBLAKE2も同程度の安全性を持つ現代的な選択肢です。
CRC32:事故向けで、攻撃向けではない
CRC32やAdler-32は、転送やアーカイブでの偶然の破損を検出する高速なチェックサムです。一致する値は誰でも意図的に作れるので、改ざんは防げません。
パスワードを高速なハッシュで保存しない
これが最もよくある間違いです。パスワードにとって速さはまさに不要なもので、グラフィックカードは毎秒数十億回のSHA-256を試せます。Argon2、bcrypt、scryptのような、パスワード用に設計された遅くてソルト付きのアルゴリズムを、フレームワークのパスワードライブラリ経由で使ってください。
ハッシュ、暗号化、エンコードは別物
エンコード Base64, hex, URL 誰でも元に戻せる、鍵なし
暗号化 AES, RSA 鍵があれば元に戻せる
ハッシュ SHA-256, MD5 一方向、元に戻せない
ハッシュは「復号」できません。MD5を逆算できると称するサイトは、既知の入力を集めた巨大な表からハッシュを探しているだけです。よくある単語や短いパスワードなら見つかりますが、長くてランダムなものには通用しません。
ダウンロードを検証する
多くのプロジェクトは、ダウンロードファイルの横にSHA-256のチェックサムを公開しています。受け取ったファイルのハッシュを計算して2つの値を比べましょう。1文字でも違えば、ファイルが壊れているか、公開者が出したものではありません。どのOSにも組み込みのコマンドがあります。
Linux sha256sum file.iso
macOS shasum -a 256 file.iso
Windows certutil -hashfile file.iso SHA256
PowerShell Get-FileHash file.iso -Algorithm SHA256
ハッシュの長さ
MD5は128ビット(16進数で32文字)、SHA-1は160ビット(40文字)、SHA-256は256ビット(64文字)、SHA-512は512ビット(128文字)です。変更されていないことだけでなく、誰がメッセージを作ったかを証明したいなら、HMACかデジタル署名を使いましょう。単なるハッシュは、内容を書き換えた人なら誰でも計算し直せます。
どれを使うか、1行ずつ
- ダウンロードやバックアップの確認:SHA-256。
- 署名、証明書などセキュリティに関わるもの:SHA-256以上。MD5やSHA-1は使わない。
- 重複ファイルの検出やキャッシュキーの作成:MD5やSHA-1で十分で、高速です。
- プロトコルやアーカイブでの転送エラーの検出:CRC32。
- パスワードの保存:上記のどれでもなく、Argon2、bcrypt、scryptを使う。
ハッシュが一致しない理由
2つのツールで「同じ」テキストのハッシュが違うとき、入力はほとんどの場合同じではありません。末尾の改行、Windowsの改行コード、別の文字コードは結果をすべて変えてしまいます。4Devのハッシュ生成ツールは、md5sum、sha256sum、Pythonのhashlibと同じくテキストをUTF-8のバイトとしてハッシュ化し、MD5、SHA-1、SHA-2、SHA-3、BLAKE2、CRC32など17のアルゴリズムに対応しています。