Skip to content
ブログに戻る
チュートリアル

MD5 vs SHA-256:開発者のためのハッシュアルゴリズム比較ガイド

MD5、SHA-1、SHA-256、SHA-512 のハッシュアルゴリズムをセキュリティ、速度、出力サイズ、実際のユースケースの観点から比較。チェックサム、整合性検証、パスワード保存にどのハッシュを選ぶべきかを解説します。

12 min read

MD5 vs SHA-256:どちらのハッシュアルゴリズムを使うべきか?

ハッシュはコンピューティングにおいて最も基本的な操作のひとつですが、間違ったアルゴリズムを選ぶと、衝突攻撃やデータ破損、不必要なパフォーマンスオーバーヘッドにシステムをさらすことになりかねません。本ガイドでは最も広く使われている 4 つのハッシュアルゴリズムを比較し、明確な選択フレームワークを提供します。

ハッシュ関数とは?

暗号学的ハッシュ関数は、任意の入力データを受け取り、固定長の出力(「ダイジェスト」または「ハッシュ」)を生成します。優れたハッシュ関数には 3 つの性質があります:

  1. 決定性:同じ入力は常に同じ出力を生成する。
  2. 一方向性:ハッシュ値から元の入力を復元できない。
  3. 衝突耐性:同じハッシュを生成する 2 つの異なる入力を見つけることが計算上実行不可能である。

性質 3 が破られると、そのアルゴリズムは「暗号学的に破られた」とみなされます。MD5 と SHA-1 がまさにそのケースです。

アルゴリズム比較一覧

項目MD5SHA-1SHA-256SHA-512
出力サイズ128 ビット(16進数 32 文字)160 ビット(16進数 40 文字)256 ビット(16進数 64 文字)512 ビット(16進数 128 文字)
ブロックサイズ512 ビット512 ビット512 ビット1024 ビット
公開年1991199520012001
設計者Ron RivestNSA / NISTNSA / NISTNSA / NIST
衝突耐性破られた(2004)破られた(2017)安全安全
速度(相対)最速高速中程度中程度(64 ビットではより高速)
NIST ステータス非推奨非推奨推奨推奨

MD5:高速だが破られている

MD5(Message-Digest Algorithm 5)は 1991 年に Ronald Rivest によって設計され、1990 年代から 2000 年代初頭にかけてチェックサムのデファクトスタンダードとなりました。128 ビットのハッシュを 16 進数 32 文字で生成します。

なぜ MD5 は破られたのか

2004 年、王小雲が MD5 に対する実用的な衝突攻撃を実証しました。2008 年には研究者たちが MD5 の衝突を利用して不正な SSL 証書を作成し、この攻撃が理論上だけのものではないことを証明しました。現在では、一般的なハードウェアで数秒以内に MD5 衝突を生成できます。

// MD5 ハッシュを生成(セキュリティ用途以外のみ)
// Web Crypto API は MD5 に対応していないため、ライブラリを使用
import { md5 } from 'hash-wasm';

const hash = await md5('Hello, World!');
console.log(hash);
// → 'bea8252ff4e80f41719ea13cdf007273' (32 hex chars)

MD5 がまだ使える場面

暗号学的に破られているとはいえ、MD5 はセキュリティに関係しない用途では依然として有用です:

  • ファイルの重複検出:ストレージシステムにおける重複ファイルの検出
  • キャッシュキー:キャッシュ検索用の短く決定的なキーの生成
  • データ整合性チェックサム:データが意図せず破損していないことの簡易検証(意図的な改ざんの検出ではない)
  • レガシーシステムとの互換性:MD5 を必要とする旧システムとの相互運用

重要な違い:MD5 は偶発的な破損に対しては有効ですが、意図的な改ざんに対しては無力です。

SHA-1:非推奨だが残存している

SHA-1(Secure Hash Algorithm 1)は NSA が設計し、1995 年に NIST が公開しました。160 ビットのハッシュを 16 進数 40 文字で生成します。

2017 年、Google と CWI Amsterdam が初の実用的な SHA-1 衝突(「SHAttered」攻撃)を実証し、同じ SHA-1 ハッシュを持つ 2 つの異なる PDF ファイルを生成しました。主要なブラウザや認証局は 2016 年までにすでに SHA-1 証明書の拒否を開始していました。

SHA-1 の使用は、SHA-1 を必要とするシステムとの互換性が求められる場合に限定してください(例:Git はコミットハッシュに SHA-1 を使用していますが、SHA-256 への移行が進んでいます)。新規開発では SHA-256 以上を選択してください。

SHA-256:現在のスタンダード

SHA-256 は SHA-2 ファミリーに属し、NSA が設計し、2001 年に NIST が公開しました。256 ビットのハッシュを 16 進数 64 文字で生成し、2026 年現在、ほぼすべてのハッシュ用途で推奨されるアルゴリズムです。

// Web Crypto API を使用して SHA-256 ハッシュを生成(ブラウザネイティブ)
async function sha256(text) {
  const data = new TextEncoder().encode(text);
  const hash = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(hash))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}

const hash = await sha256('Hello, World!');
console.log(hash);
// → 'dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f'

なぜ SHA-256 がデフォルトの選択なのか

  • 既知の攻撃なし:2026 年時点で、SHA-256 に対する実用的な衝突攻撃や原像攻撃は存在しない
  • ブラウザネイティブ:すべてのモダンブラウザで Web Crypto API を通じて利用可能で、ライブラリ不要
  • 業界標準:TLS 証明書、Bitcoin、パッケージマネージャ(npm、pip)、Docker イメージダイジェスト、および大半の整合性検証システムで使用
  • NIST 承認済み:すべてのセキュリティ重要なアプリケーションに推奨

SHA-512:より高い安全性が必要な場合

SHA-512 は 512 ビットのハッシュを 16 進数 128 文字で生成します。1024 ビットのブロックサイズ(SHA-256 は 512 ビット)を使用しており、1 サイクルあたりの処理データ量が多いため、64 ビットプロセッサでは SHA-256 よりも高速です。

# Python: SHA-512 は SHA-256 と同じくらい簡単
import hashlib

hash_256 = hashlib.sha256(b'Hello, World!').hexdigest()
hash_512 = hashlib.sha512(b'Hello, World!').hexdigest()

print(f"SHA-256: {hash_256}")  # 64 chars
print(f"SHA-512: {hash_512}")  # 128 chars

SHA-512 を使うべき場面:

  • より大きなセキュリティマージンが必要な場合(256 ビットの衝突耐性、SHA-256 は 128 ビット)
  • 64 ビットプラットフォームでパフォーマンスが重要な場合(SHA-512 は x86-64 で SHA-256 の 1.5 倍速になりうる)
  • プロトコルや仕様が要求する場合(一部の証明書スキーム、特定のコンプライアンス要件)

ほとんどのアプリケーションでは SHA-256 で十分です。SHA-512 のハッシュ長が長い分、ストレージと帯域幅が倍になりますが、一般的なユースケースでは実質的なセキュリティ上の利点はありません。

選択フレームワーク:どのハッシュを使うべきか

ファイル整合性とチェックサムの場合

SHA-256 を使用してください。 ダウンロードの検証、ファイル内容の比較、データ破損の検出における標準です。既存の MD5 ベースのシステムを置き換える場合、SHA-256 はそのまま代替として使えます。

# ダウンロードの整合性を検証
sha256sum downloaded-file.tar.gz
# 出力を公開されたハッシュ値と比較

パスワード保存の場合

MD5 も SHA-256 も直接使わないでください。 汎用ハッシュ関数はパスワードハッシュには高速すぎます。攻撃者は 1 秒あたり数十億回の推測を試行できます。代わりに、専用のパスワードハッシュアルゴリズムを使用してください:

アルゴリズムステータス備考
Argon2id推奨2015 年パスワードハッシュコンペティション優勝;メモリハード
bcrypt良好幅広くサポート;ソルト内蔵;調整可能なワークファクター
scrypt良好メモリハード;一部の暗号通貨システムで使用
PBKDF2許容範囲NIST 承認済みだがメモリハードではない;≥600,000 回の反復推奨
SHA-256不適切高速すぎる;ソルト非内蔵;GPU 攻撃に脆弱
MD5危険破られている上に高速すぎる;容易にクラック可能
// 悪い例:SHA-256 でパスワードをハッシュしない
const hash = await sha256(password); // 毎秒数十億回のクラックが可能

// 正しい例:bcrypt を使用(Node.js の例)
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12); // 12 ラウンド ≈ 250ms
const isValid = await bcrypt.compare(input, hash);

HMAC とメッセージ認証の場合

SHA-256 と HMAC を組み合わせて使用してください。 HMAC(Hash-based Message Authentication Code)はハッシュ関数と秘密鍵を組み合わせ、整合性と真正性の両方を検証します:

// HMAC-SHA256 による Webhook 署名検証
async function verifyWebhook(payload, signature, secret) {
  const key = await crypto.subtle.importKey(
    'raw', new TextEncoder().encode(secret),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']
  );
  const sig = Uint8Array.from(atob(signature), c => c.charCodeAt(0));
  return crypto.subtle.verify('HMAC', key, sig, new TextEncoder().encode(payload));
}

コンテンツアドレス可能ストレージの場合

SHA-256 を使用してください。 Git、Docker、IPFS はいずれもコンテンツアドレス可能ストレージを使用しており、コンテンツのハッシュがそのアドレスとなります。SHA-256 は数十億のオブジェクト間で一意性を保証するのに十分な衝突耐性を提供します。

パフォーマンスベンチマーク

最新の x86-64 プロセッサにおける相対ハッシュ速度(値が大きいほど高速):

アルゴリズムスループット (MB/s)相対速度
MD5~3,2001.0x(基準)
SHA-1~2,4000.75x
SHA-256~1,5000.47x
SHA-512~2,1000.66x

注意:SHA-512 は内部状態が広いため、64 ビットプロセッサでは SHA-256 より高速です。32 ビットシステムではこの関係が逆転します。ほとんどのアプリケーションでは速度差は無視できるレベルです。どのアルゴリズムでも 1 MB のファイルのハッシュ化は 1 ミリ秒以下で完了します。

よくある間違い

1. MD5 をセキュリティ用途に使用する

MD5 の衝突生成は極めて容易です。デジタル署名、証明書の検証、攻撃者が悪意のある入力を作成しうるあらゆるシナリオに MD5 を使用してはいけません。

2. SHA-256 でパスワードをハッシュする

SHA-256 はパスワードハッシュではありません。速度が速すぎ、ソルトが内蔵されておらず、レインボーテーブルや GPU を活用したブルートフォース攻撃に対して脆弱です。Argon2id または bcrypt を使用してください。

3. ハッシュ長がセキュリティと等しいと考える

512 ビットのハッシュが 256 ビットのハッシュよりも自動的に「安全」というわけではありません。SHA-256 のセキュリティマージン(128 ビットの衝突耐性)はすでにブルートフォースの能力をはるかに超えています。ハッシュ長ではなく、実際の要件に基づいて選択してください。

4. 独自のハッシュ組み合わせを作る

SHA256(MD5(data))MD5(data + salt) のようなパターンは、破られたアルゴリズムを魔法のように修復するものではありません。単一の十分に検証されたアルゴリズム(SHA-256)または適切な構成(HMAC)を使用してください。

実際に試してみよう

ハッシュジェネレーターで MD5、SHA-1、SHA-256、SHA-512 のハッシュを即座に生成・比較できます。テキストを貼り付けるかファイルをドロップするだけで、4 種類のダイジェストを並べて確認できます。100% ブラウザ内で動作し、データがデバイスの外に出ることは一切ありません。

認証、入力バリデーション、セキュリティヘッダーを含む Web セキュリティの全体像については、Web セキュリティの基本ガイドをご覧ください。

よくある質問

MD5 はチェックサムとしてまだ安全ですか?

MD5 は偶発的なファイル破損の検出には安全です。ダウンロード中にファイルが破損した場合、MD5 ハッシュはほぼ確実に変化します。しかし、意図的な改ざんに対しては安全ではありません。攻撃者は同じ MD5 ハッシュを持つ改変ファイルを作成できるためです。敵対者が想定される整合性検証(ソフトウェア配布など)には SHA-256 を使用してください。

SHA-256 は MD5 と比べてどのくらい遅いですか?

SHA-256 は生のスループットで MD5 のおよそ 2 倍遅くなります。最新のハードウェアでは、MD5 は約 3,200 MB/s、SHA-256 は約 1,500 MB/s でハッシュ化します。実際のところ、この差はほとんどのアプリケーションで無視できます。SHA-256 で 100 MB のファイルをハッシュ化するのに約 70 ミリ秒です。パフォーマンスの差が問題になるのは、ネットワークパケット検査や大規模ストレージの重複排除など、非常に高いスループットが求められるシナリオに限られます。

アプリケーションには SHA-256 と SHA-512 のどちらを使うべきですか?

ほとんどのアプリケーションには SHA-256 を使用してください。128 ビットの衝突耐性を提供し、ブルートフォースの能力をはるかに超えています。SHA-512 を選択するケース:(a) 64 ビットプラットフォームで最大スループットが必要な場合、(b) 仕様やコンプライアンス要件が義務付けている場合、(c) 長期的なデータ整合性のためにより大きなセキュリティマージンが必要な場合。SHA-512 の長いハッシュ長はストレージを倍にし、通常は不要です。

SHA-256 はクラックや解読が可能ですか?

SHA-256 は解読できません。一方向関数です。2026 年時点で、SHA-256 に対する実用的な原像攻撃や衝突攻撃は存在しません。衝突に対する最良の既知攻撃には 2^128 回の演算が必要であり、現在および予測可能な技術では計算上実行不可能です。SHA-256 は NIST の承認を受けており、TLS、Bitcoin、政府システムなどの重要インフラで使用されています。

MD5 が破られているのに、なぜ一部のシステムはまだ使っているのですか?

レガシー互換性が主な理由です。多くの既存のシステム、プロトコル、ファイルフォーマットは、MD5 の脆弱性が発見される前に設計されました。移行にはすべてのコンポーネントにわたる協調的な変更が必要です。キャッシュキーや重複排除などのセキュリティに関係しない用途では、MD5 の速度面の利点と短い出力が、衝突攻撃が脅威モデルに含まれない場合の実用的な選択肢となっています。