セキュリティ · 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のアルゴリズムに対応しています。

ハッシュ生成ツールを開く

LinkedInXFacebook