なぜパスワードを平文で保存してはいけないのか(ハッシュ化とソルト)
データベース侵害に関するニュースをよく耳にします。
これらのイベントでは、企業はしばしば「パスワードは暗号化されており安全です」と主張します。厳密に言えば、これは正しくありません。パスワードは「暗号化」されるべきではなく、「ハッシュ化」 されるべきです。
暗号化とハッシュ化の違い、そしてなぜMD5やSHA-1の使用を避けるべきかを探りましょう。
1. 暗号化 vs ハッシュ化
主な違いは 「可逆性」 にあります。
- 暗号化: キーを使用してデータを変換します。キーがあれば元のデータに戻す(復号化)ことができます。(双方向)
- ハッシュ化: データを固定長の文字列に変換します。元のデータに戻すことはできません。(一方向)
サーバー管理者であっても、ユーザーのパスワードを知るべきではありません。したがって、不可逆的な ハッシュ化 を使用する必要があります。
2. レインボーテーブル攻撃
「では、SHA-256のようなハッシュ関数を使用すれば安全ですか?」
残念ながら、そうではありません。ハッシュ関数は決定論的です。つまり、同じ入力に対して常に同じ出力を生成します。
ハッカーは、123456 や password などの一般的なパスワードのハッシュ値を事前に計算し、レインボーテーブル と呼ばれる巨大なテーブルに保存します。
彼らがあなたのDBからハッシュ化されたパスワードを盗んだ場合、これらのテーブルで検索するだけで、元のパスワードを即座に解読できます。
3. ソルト(Salting)
これを解決するために、ソルト(Salting) を使用します。
パスワードをハッシュ化する前に、ランダムな文字列(ソルト)を付加します。
Hash("password") -> 危険
Hash("password" + "random_salt_value") -> 安全
ソルトを使用すると、2人のユーザーが同じパスワードを持っていても、(ソルトが異なるため)異なるハッシュ値になり、レインボーテーブルは役に立たなくなります。
結論
パスワードの保存に単純なハッシュ関数(MD5、SHA-1、SHA-256)を使用しないでください。これらは高速になるように設計されているため、ブルートフォース攻撃に対して脆弱です。
代わりに、ソルトとキーストレッチングを組み込んだ 専用のアルゴリズム を使用してください。
- 推奨アルゴリズム: Argon2, bcrypt, scrypt, PBKDF2
セキュリティとは、「壊れない」ことではなく、「侵入のコストを上げる」ことです。正しいハッシュアルゴリズムを使用することで、そのコストを天文学的に上げることができます。
関連ツールを見る
Pockitの無料開発者ツールを試してみましょう