Mímisbrunnr知恵の泉

← サイバーセキュリティ 一覧

🎓 レベル:基礎 | 重要度:A(必須) 📎 前提:対称鍵暗号とハッシュ

要点(BLUF)

概念:3つの認証要素

認証は「主張する本人であること」をどう確かめるかで、材料(要素)は3種類です。

1種類だけ(多くはパスワード)に頼るのが弱い理由は、漏えい・使い回し・推測のどれかで突破されうるからです。だから異なる種類を組み合わせるのが基本戦略になります。

仕組み:パスワードの安全な保存

守る側の最重要ポイントは「漏れても困らない形で保存する」ことです。DB はいつか漏れる前提で設計します。

推奨アルゴリズムは Argon2id(メモリ困難・第一候補)、次いで bcrypt、環境制約があれば PBKDF2scrypt(いずれも要最新確認のパラメータで)。OWASP の目安では bcrypt はコスト 10 以上、Argon2id はメモリ・反復・並列度を環境に合わせて設定します。

仕組み:多要素認証(MFA)

MFA は異なる種類の要素を2つ以上要求します(知識+所持など)。同種を2つ(パスワード2個)では意味がありません。

flowchart TD
    L["ログイン要求"] --> F1{"第1要素:パスワード照合(KDFで検証)"}
    F1 -->|"一致"| F2{"第2要素:所持の確認(認証アプリ・鍵)"}
    F1 -->|"不一致"| DENY["拒否(安全側に倒す)"]
    F2 -->|"確認OK"| OK["認証成功(セッション発行へ)"]
    F2 -->|"確認NG"| DENY

防御側の使い方/設定

なぜ安全か:低速化が攻撃コストを跳ね上げる

低速 KDF が効くのは、正規の1回のログインでは無視できる遅延でも、総当たりでは天文学的なコストになるからです。ソルトは「1人破る労力で全員は破れない」ようにし、事前計算表を使えなくします。MFA は「片方の要素が漏れても、もう一方が無ければ入れない」状態を作り、パスワード漏えい単体を無効化します。

security-study/labs/password_hashing_demo.py の実行結果(抜粋):

=== 1. bcrypt:同じパスワードでも保存値が毎回変わる ===
hash1 = $2b$12$xlvO3YgYm7q0iIybaWWE/.vF/C0dcqMpb1sVoGG8arD/t7Fmu5pX.
hash2 = $2b$12$jLWNHp67XN1aZlRrC0spLO7UBd1FEQV0ZTzpUzH7WFOnd6obUWbxG
2つは別物 -> True
=== 2. 検証は専用の照合関数で ===
正しいパスワード -> True
誤ったパスワード -> False

同じパスワードでも保存値が毎回変わる(ソルト内蔵)こと、検証は照合関数で行うことが確認できます。

仕組みの直観

パスワード保存は金庫のダイヤル錠に似ています。平文保存は「金庫の番号を扉に貼る」、高速ハッシュは「すぐ回せる軽いダイヤル」。低速 KDF は「1回転に数秒かかる重いダイヤル+人ごとに違う初期位置(ソルト)」。正規利用者は1回だけ回すので平気ですが、総当たりは回し切れません。MFA は「ダイヤルに加えて物理鍵も要る」二重ロックです。

⚠️ よくある誤解・設定ミス

対応 lab

関連