【入門編】安全なパスワードハッシュ化アルゴリズム (Argon2, bcrypt) – アプリケーションセキュリティ & 安全な開発防御ガイド

こんにちは。セキュリティの世界へようこそ。
今日は、皆さんの大切なアプリケーションを守る「最後の砦」――パスワードの守り方について、少しだけ深く、そして泥臭い現場の視点でお話ししたいと思います。

「パスワードはハッシュ化して保存しましょう」なんて言葉、教科書で何度も目にしますよね。でも、なぜそれが重要なのか、そしてなぜ昔のやり方じゃダメなのか。泥棒の視点に立って、一緒に紐解いていきましょう。

—

1. 玄関の鍵を「コピー不可」にする仕組み

パスワードをそのまま(平文で)データベースに保存するのは、自宅の玄関に「鍵を置いたまま外出する」のと同じです。泥棒(攻撃者)が侵入した瞬間、家の中はやりたい放題。

そこで登場するのが「ハッシュ化」です。
これは、パスワードを「元に戻せない暗号のような文字列」に変換する技術。皆さんが普段使っている「鍵」を、「鍵の形を読み取れないようにぐちゃぐちゃに潰した粘土」に変えて保管するようなイメージです。

なぜMD5やSHA-1は「捨てられた鍵」なのか?

昔はよく使われていたMD5やSHA-1ですが、今やこれらは「一瞬で解読される鍵」です。
現代の攻撃者は、世界中のパスワードとハッシュの組み合わせを記録した「レインボーテーブル」という辞書を持っています。MD5なら、どんなに複雑なパスワードでも、数秒から数分で「元の鍵」を突き止めてしまいます。

だからこそ、私たちは「計算に時間がかかるアルゴリズム」を使う必要があるんです。

—

2. なぜ「Argon2」や「bcrypt」が最強なのか?

今、プロの現場で推奨されているのが Argon2 や bcrypt です。これらは単にハッシュ化するだけでなく、わざと「計算を重くする」という性質を持っています。

  • ソルト(Salt)の重要性:

パスワードにランダムな文字列(塩)を混ぜてからハッシュ化します。これにより、「同じパスワードでも、ユーザーごとに違うハッシュ値」になります。泥棒が「Aさんのパスワード」を解読しても、その辞書は「Bさん」には通用しない。これがソルトの力です。

  • 計算コスト(Work Factor)の調整:

これらには、計算の難易度を調整するノブがついています。PCの性能が上がれば、このノブを回して「計算をもっと難しく」すればいい。攻撃者にとっては「1つ解読するのに1秒かかる」という状況が、何百万件ものユーザーを狙う彼らにとっては致命的な足止めになるんです。

—

3. 実践!安全なパスワード保存のコード例

では、実際にどう書くか。ここではPHPの標準的なライブラリを使った例を見てみましょう。複雑な暗号ライブラリを自作してはいけません。枯れた技術、信頼できるライブラリを使うのがセキュリティの鉄則です。

  • password_hash関数は、内部的にソルトを自動生成し、
  • 強力なアルゴリズム(現在はbcryptが標準)でハッシュ化してくれます。
  • /
    $hashedPassword = password_hash($password, PASSWORD_ARGON2ID);

    // データベースには $hashedPassword を保存するだけ!
    // 元のパスワードは絶対にDBに書き込んではいけません。

    // ログイン時の検証方法
    if (password_verify($password, $hashedPassword)) {
    echo “ログイン成功!”;
    } else {
    echo “パスワードが違います。”;
    }
    ?>

    パラメータの考え方

    password_hash には cost などの設定を追加できます。

    • メモリ使用量と時間: サーバーのスペックに合わせて「ログイン処理に0.5秒〜1秒程度かかる」くらいの負荷を目指すのが、UX(使いやすさ)とセキュリティのバランスが良いとされています。

    —

    4. 最後に:セキュリティは「いたちごっこ」ではない

    たまに「どうせハッシュ化しても解読されるなら意味がないのでは?」と言う人がいます。でも、考えてみてください。

    泥棒は「一番入りやすい家」を狙います。
    最新のアルゴリズムを使い、計算コストを適切に設定し、ソルトを混ぜる。この「手間」をかけるだけで、あなたのアプリケーションは「解読に何百年もかかる要塞」になります。

    「完璧な防御」は存在しません。でも、「泥棒が割に合わないと諦める防御」は作れます。

    まずは今日から、古いプロジェクトでMD5を使っていないか確認してみてください。もし見つけたら、それがあなたの腕の見せ所です。一歩ずつ、安全なコードを積み上げていきましょう!

    何か困ったことがあれば、またいつでも聞きに来てくださいね。現場からは以上です!

    コメント

    タイトルとURLをコピーしました