DevUtils
技術ガイド
セキュリティ・暗号5分で読める

暗号学的ハッシュ(SHA-256)とパスワードハッシュ(bcrypt/Argon2)の決定的な違い

一方向ハッシュ関数の基礎、超高速SHA-256をパスワード保存に使ってはならない理由、レインボーテーブル攻撃、ソルトと適応型KDF(bcrypt、Argon2id)の実務導入を徹底解説します。

実践ツールを使ってみる

ハッシュ生成ツール

データをサーバーに送信せず、すべてブラウザ内で安全に検証・実行できます。

ツールを開く

一方向暗号学的ハッシュ関数の動作原理と3大セキュリティ要件

暗号学的ハッシュ関数は、任意の長さの入力データを固定長のダイジェスト(ハッシュ値)へ変換する決定論的数学アルゴリズムです。NIST(米国国立標準技術研究所)のFIPS 180-4で標準化されたSHA-256をはじめとする安全なハッシュ関数は、以下の3大耐性を満たす必要があります:

  1. 原像計算困難性(Pre-image Resistance, 一方向性): 出力値hから、元の入力メッセージm(hash(m) = h)を逆算することが計算量的に不可能であること。
  2. 第2原像計算困難性(Second Pre-image Resistance, 弱衝突耐性): 特定の入力m1に対し、同じハッシュ値を持つ異なる入力m2(hash(m1) = hash(m2))を発見することが不可能であること。
  3. 衝突困難性(Collision Resistance, 強衝突耐性): 同じハッシュ値を出力する任意の異なる2つの入力ペアm1とm2を見つけ出すことが不可能であること。

さらに暗号学的ハッシュ関数は雪崩効果(Avalanche Effect)を備えており、入力の1ビットが反転するだけで出力ハッシュの約50%のビットが無作為に変化するため、元の入力パターンを推測することは完全に不可能です。

高速ハッシュ vs 低速ハッシュ:パスワード保存にSHA-256を使ってはならない理由

セキュリティ設計において最も危険な誤解は、「SHA-256は暗号学的に安全だから、パスワードの保存にも安全だ」という思い込みです。SHA-256やSHA-512、BLAKE3は、大容量ファイルの完全性検証やTLS通信の高速処理を目的とした超高速ハッシュ関数として最適化されています。

しかし、この「計算の速さ」は人間が設定したパスワードを守る際には致命的な欠陥となります。最新の民生用ハイエンドGPU(NVIDIA RTX 4090など)は、1台で毎秒200億回以上のSHA-256計算を並列実行できます。万が一データベースからハッシュ値が流出した場合、攻撃者はオフライン総当たり攻撃(Brute-force)を用いて、一般的な英数字8文字程度のパスワードを数時間で解読してしまいます。

パスワード専用保護技術:ソルト(Salt)、ペッパー(Pepper)、適応型コスト

パスワードを安全に保護するには、意図的に計算時間を遅く設計した鍵導出関数(KDF)が不可欠です:

  • 暗号学的ソルト(Salt): パスワードごとに毎回ランダムに生成される16バイト以上の固有文字列です。ハッシュ値と一緒に平文でデータベースに保管されます。ソルトは事前に計算されたハッシュ表であるレインボーテーブル(Rainbow Table)攻撃を完全に無力化し、同一パスワードのユーザー同士でも異なるハッシュ値が生成されることを保証します。
  • ペッパー(Pepper): データベースとは別の秘密管理機構(KMSや環境変数)に保存する共通シークレット鍵です。万一SQLインジェクションでDBが漏洩しても、ペッパーがなければ解読できません。
  • 適応型コスト(Work Factor): ハードウェアの進化に合わせて計算難易度を引き上げられるパラメータです。1回のパスワード検証に200〜500ミリ秒程度の計算時間を要するように設定することで、GPU並列攻撃の効率を極小化します。

現代のパスワードハッシュ標準比較:bcrypt、PBKDF2、Argon2id

  • PBKDF2(RFC 8018): HMACを数十万回反復する伝統的標準規格です。実績は豊富ですがCPU演算にのみ依存するため、ASIC専用チップを用いた並列計算に弱いという弱点があります。
  • bcrypt: Blowfish暗号をベースに20年以上の実績を持つ事実上のWeb標準です。ただし、入力パスワードが72バイトを超えると末尾が自動的に切り捨てられる制限が存在します。
  • Argon2id(RFC 9106): パスワードハッシュ競技会で優勝した現行最高峰のアルゴリズムです。CPU時間だけでなくメモリ使用量(Memory-Hardness)を強制するため、GPUやASICによる並列計算を物理的に阻害します。新規開発ではArgon2idの採用が最も推奨されます。

本番環境での安全な検証とタイミング攻撃(Timing Attack)防御

ハッシュ値や署名を照合する際に通常の文字列比較演算子(===)を使うと、最初の不一致文字が見つかった時点で処理が中断されるため、微細な応答時間のズレが生じます。攻撃者はこの時間差を測定してハッシュ値を1文字ずつ特定するタイミング攻撃を実行できます。これを防ぐため、Node.jsのcrypto.timingSafeEqual()などの定数時間(Constant-time)比較APIを使用してください。

JAVASCRIPTDevUtils Code Reference
// Node.jsにおける安全なハッシュ生成と定数時間比較の実装
import crypto from 'node:crypto';

// データ完全性検証用の高速ハッシュ(パスワード保存には使用不可)
export function computeSha256(data) {
    return crypto.createHash('sha256').update(data).digest('hex');
}

// タイミング攻撃を防ぐ定数時間比較関数
export function verifySignatureSafe(expectedHex, actualHex) {
    const a = Buffer.from(expectedHex, 'hex');
    const b = Buffer.from(actualHex, 'hex');
    if (a.length !== b.length) return false;
    return crypto.timingSafeEqual(a, b); // 一致不一致にかかわらず一定時間で完了
}
タグ:ハッシュセキュリティSHA-256bcryptArgon2パスワード
実践ツールを使ってみる

ハッシュ生成ツール

無料のオンラインハッシュ計算ツール。MD5, SHA-1, SHA-256, SHA-512に対応。

ツールを開く