パスワードハッシュにおけるソルト

パスワードハッシュのソルトとは何か、レインボーテーブルや辞書攻撃を防ぐ方法、適切なソルト生成方法、bcryptなどのアルゴリズムがソルトを自動処理する仕組みを解説します。

General

詳細な説明

ソルトとは、ハッシュ前にパスワードと組み合わされるランダムな値で、同一のパスワードが異なるハッシュ出力を生成することを保証します。ソルトはパスワードセキュリティにおける最も重要な防御の一つで、事前計算攻撃を防ぎ各パスワードハッシュを一意にします。

ソルトが解決する問題:

ソルトなしでは同じパスワードは常に同じハッシュを生成します。1,000人のユーザーが「password123」を選んだ場合、データベースの1,000行すべてに同じハッシュ値が入ります。1つ解読すれば全員分が解読されます。さらに、攻撃者は一般的なパスワードハッシュの辞書(レインボーテーブル)を事前計算し、即座にハッシュを検索できます。ソルトは両方の問題を解消します。

ソルトの使用方法:

ソルトは暗号学的に安全な乱数生成器(/dev/urandomcrypto.randomBytes()SecureRandomなど)で生成されます。パスワードと組み合わせてハッシュ関数に入力します:hash(salt || password)。ソルトはデータベースにハッシュと並べて保存されます。ソルトは秘密である必要はなく、一意性を保証することが目的です。

ソルトの要件:

良いソルトは128ビット(16バイト)以上の暗号学的ランダムデータであるべきです。各パスワードに固有のソルトが必要で、ユーザー間でソルトを再利用しないでください。予測可能な値(ユーザー名、ユーザーID、タイムスタンプ)をソルトとして使用しないでください。

最新の実装:

bcryptはソルトを出力文字列形式の一部として保存します:$2b$12$[22文字のソルト][31文字のハッシュ]。Argon2も同様にパラメータとソルトを出力にエンコードします。これらのアルゴリズムを使用する場合、ソルトの生成と保存は自動的に処理されます。

よくある間違い:

短いソルト(16バイト未満)の使用、全ユーザーで同じソルトの再利用、予測可能なソルト(連番整数、タイムスタンプ)の使用、適切なパスワードハッシュアルゴリズムなしでのMD5やSHA-256の使用、ソルトの保存忘れ。

ユースケース

すべてのパスワード保存システムは、レインボーテーブル攻撃を防ぎ、同一パスワードがデータベース内で異なるハッシュ値を生成するよう、ユーザーごとの固有ソルトを使用する必要があります。

Try It — Hash Generator

フルツールを開く