【入門編】パスワードハッシュ化における適切なソルトとストレッチング(Argon2/bcrypt) – アプリケーションセキュリティ & 安全な開発防御ガイド

パスワードは「ただの鍵」じゃない。泥棒に合鍵を作らせないための「ハッシュ化」入門

こんにちは。セキュリティの世界へようこそ。

あなたは、自分の家の鍵を道端に落としてしまったらどうしますか? 鍵を拾った泥棒は、それを複製していつでもあなたの家に忍び込めますよね。

Webサービスにおける「パスワード」も同じです。データベースが漏洩したとき、そこにパスワードがそのまま(平文で)保存されていたら、それは泥棒に合鍵を配っているのと同じこと。だからこそ、私たちは「ハッシュ化」という魔法を使って、元の鍵が何かわからないように加工して保存します。

今日は、MD5やSHA-1といった「昔の防犯術」がなぜ通用しなくなったのか、そして現代最強の防犯術「Argon2」や「bcrypt」をどう使えばいいのか、一緒に学んでいきましょう。

1. なぜMD5やSHA-1は「欠陥住宅」なのか?

昔、パスワードを隠すためによく使われていたMD5やSHA-1は、現代の攻撃者から見れば「鍵がかかっていないも同然」です。

なぜなら、これらは「計算が速すぎる」からです。

攻撃者は、「レインボーテーブル」という、ありとあらゆるパスワードの組み合わせを計算済みの辞書を持っています。MD5はあまりに高速に計算できるため、数秒で何十億通りのパターンを照らし合わせ、あなたのパスワードを特定できてしまうのです。

家の防犯に例えるなら、MD5は「紙で作った鍵」です。見た目はそれっぽいですが、泥棒が少し力を入れれば一瞬で破られてしまいますよね。

2. 現代の防犯術:「ソルト」と「ストレッチング」

現代のパスワード管理において、欠かせないのが「ソルト(Salt)」と「ストレッチング(Stretching)」です。

ソルト:同じ鍵でも形を変える

同じパスワード(例:`password123`)を使っている人が何人もいる場合、ハッシュ化しても結果が同じになってしまいます。これだと、攻撃者は「このハッシュ値を持つ人が一番多いから、これは『password123』に違いない」と推測できてしまいます。
そこで、一人ひとりにランダムな文字列(塩:ソルト)を混ぜてからハッシュ化します。こうすることで、同じパスワードでも全く異なるハッシュ値が生成され、攻撃を格段に難しくできるのです。

ストレッチング:わざと「重く」する

あえてハッシュ計算に時間をかけることで、攻撃者が何十億回も試行することを物理的に不可能にします。
これは、鍵穴に「わざと複雑な迷路」を付け加えるようなもの。人間がログインする0.5秒の待ち時間は気になりませんが、攻撃者が1秒間に何万回も試行しようとすると、莫大な時間がかかって諦めるしかなくなります。

3. 実践!Argon2とbcryptの選び方

現在、最も信頼されているアルゴリズムは Argon2 です。次点で bcrypt が使われます。

bcryptの実装例(Node.jsの例)

bcryptは歴史があり、多くの現場で安定して使われています。

const bcrypt = require(‘bcrypt’);

// ソルトの生成(10回繰り返して計算を重くする設定)
const saltRounds = 10;
const plainPassword = ‘my-secret-password’;

// パスワードのハッシュ化
bcrypt.hash(plainPassword, saltRounds, (err, hash) => {
// この hash をDBに保存します。元のパスワードは絶対に保存しないでくださいね!
console.log(hash);
});

Argon2の考え方

Argon2はメモリを大量に消費させることで、GPU(グラフィックボード)などを使った超高速な攻撃を封じ込める、現代の「鉄壁」です。もし新規で開発するなら、Argon2idというアルゴリズムを強く推奨します。

4. 今日からできる「守りの姿勢」

最後に、現場で設計する際に覚えておいてほしいポイントをまとめました。

  • MD5/SHA-1は絶対禁止: これらは「暗号」ではなく「要約」です。パスワードには使ってはいけません。
  • ソルトはランダムに: 手動で適当な文字列を足すのではなく、ライブラリが自動生成する安全なソルトを使ってください。
  • ストレッチングの回数を調整する: マシンの性能は年々上がります。3〜5年に一度は、ストレッチングの回数(コスト値)を見直し、計算時間を調整しましょう。
  • ライブラリを信頼する: 自作のハッシュ関数は、自作の鍵を作るようなもの。必ず世界中の専門家が検証した実績あるライブラリを使いましょう。

セキュリティは「完璧」を目指すと疲れてしまいますが、まずは「泥棒が他の家を狙いたくなるくらい、面倒くさい鍵をかける」ことから始めましょう。

一歩ずつ、確実に知識を積み上げていけば、あなたのサービスは必ず守られます。何か不安なことがあれば、いつでも相談してくださいね。一緒に安全な開発ライフを楽しみましょう!

コメント

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