こんにちは。セキュリティの現場で長年、泥臭いインシデントと対峙してきた私から、今日は「パスワードをどう守るか」という、セキュリティの基礎にして最深部のお話をしたいと思います。
教科書的な話は一旦横に置いて、まずは身近な例から始めましょう。
パスワードは「家の鍵」ではない?
よく「パスワードは家の鍵」と言われますが、実は少し違います。家の鍵は複製されたら終わりですが、デジタル世界のパスワードは「鍵そのものを金庫に預ける」のではなく、「鍵の指紋を特殊なフィルターに通して、元の鍵が何だったか推測できないような『あやふやな絵』だけを保管する」のが正しい姿です。
もし泥棒(攻撃者)があなたの家の金庫(データベース)をこじ開けたとき、そこに「123456」という鍵そのものが入っていたらどうでしょう? 全員分の鍵を盗まれて、泥棒はやりたい放題ですよね。
そうならないために、私たちは「ハッシュ関数」という魔法の機械を使います。
「指紋」を混ぜる:ソルトの役割
ハッシュ関数は、入力した文字列をぐちゃぐちゃに混ぜて、元の形に戻せない文字列(ハッシュ値)に変換します。しかし、単純なハッシュ化だけでは実は危険です。
攻撃者は「レインボーテーブル」という、世の中のよくあるパスワードを事前に計算した「答え合わせ表」を持っています。「123456」のハッシュ値がこれなら、元のパスワードは「123456」だと即座にバレてしまうのです。
ここで登場するのが「ソルト(塩)」です。
パスワードにランダムな文字列(塩)を振りかけてからハッシュ化することで、たとえ同じ「123456」というパスワードでも、ユーザーごとに全く別のハッシュ値が生成されます。泥棒が用意した「答え合わせ表」を無力化する、これが最初の防衛ラインです。
最強の盾:鍵導出関数(KDF)
ただ混ぜるだけでは足りません。現代のコンピュータは、1秒間に何兆回もハッシュ計算ができます。泥棒は「1秒間に10億通りのパスワードを試す」という力技(ブルートフォース攻撃)を仕掛けてきます。
これを防ぐのが鍵導出関数(KDF)です。これは「わざと計算に時間をかけさせる」ことで、泥棒の試行回数を劇的に減らす仕組みです。
代表的な選手たち
- PBKDF2: 老舗ですが、今となってはGPU(グラボ)で高速に計算されやすいため、少し分が悪いです。
- bcrypt: 長年愛用されてきた信頼の厚いアルゴリズム。今でも十分現役です。
- Argon2: 現在の業界標準。メモリを大量に消費させるため、GPU攻撃に非常に強く、迷ったらこれを選ぶべき王様です。
実践:Argon2でパスワードをハッシュ化する
では、PHPを使った実装例を見てみましょう。一歩ずつ、確実に守りを固めていきます。
<?php
// ユーザーのパスワード
$password = "MyStrongPassword123!";
// Argon2idアルゴリズムでハッシュ化
// 第3引数のオプションでコストを調整できます
$hash = password_hash($password, PASSWORD_ARGON2ID, [
'memory_cost' => 65536, // 使用するメモリ量 (64MB)
'time_cost' => 4, // 計算の繰り返し回数
'threads' => 2 // 並列処理数
]);
// データベースにはこの $hash を保存します
// 決して平文の $password は保存しないでください!
echo "ハッシュ化された値: " . $hash;
// ログイン時の照合
if (password_verify($password, $hash)) {
echo "ログイン成功!";
} else {
echo "パスワードが違います。";
}
?>
「コスト」をどう設定するか?
コード内の memory_cost や time_cost は、いわば「金庫を開けるまでの待ち時間」です。
- 値を大きくする:泥棒には非常に厳しいが、サーバーへの負荷も増える。
- 値を小さくする:サーバーは軽快だが、泥棒に破られやすくなる。
重要なのは、「あなたのサービスで許容できるギリギリの重さ」に設定することです。ログイン処理が0.1秒〜0.5秒程度かかる設定であれば、ユーザーはストレスを感じず、かつ攻撃者は「割に合わない」と諦めるレベルになります。
最後に:完璧を目指さなくていい
セキュリティに「絶対」はありません。しかし、今回紹介した「ソルト」を混ぜて「Argon2」で「計算コストをかける」という手順を守るだけで、攻撃者の99%はあなたのデータベースをスルーして、もっと脆弱な標的を探しに行きます。
セキュリティは、泥棒よりも少しだけ速く、少しだけ賢くあるためのゲームです。完璧を目指して疲弊するよりも、まずはこういった「定石」を一つずつ、着実に実装していきましょう。
あなたの書くコードが、誰かの大切な情報を守る強力な盾になることを応援しています。
コメント