情報セキュリティマネジメント 2017年 秋期 午前(科目A) 問18
問題文
パスワードを用いて利用者を認証する方法のうち、適切なものはどれか。
選択肢
ア:パスワードに対応する利用者IDのハッシュ値を登録しておき、認証時に入力されたパスワードをハッシュ関数で変換して比較する。
イ:パスワードに対応する利用者IDのハッシュ値を登録しておき、認証時に入力された利用者IDをハッシュ関数で変換して比較する。
ウ:パスワードをハッシュ値に変換して登録しておき、認証時に入力されたパスワードをハッシュ関数で変換して比較する。(正解)
エ:パスワードをハッシュ値に変換して登録しておき、認証時に入力された利用者IDをハッシュ関数で変換して比較する。
🔒 解説は解答すると表示されます
パスワードのハッシュ保存方式【情報セキュリティマネジメント解説】
正解の理由
正しい方法は、あらかじめパスワードをハッシュ値に変換して記録し、認証時に入力されたパスワードを同じハッシュ関数で変換して比較する方式です。問題文の選択肢では ウ がこれに当たります。
理由は次の通りです。
理由は次の通りです。
- ハッシュ関数は一方向(元に戻せない)なので、保存側にパスワードの平文(そのままの文字列)を置かずに済みます。攻撃でデータベースが漏れても平文を直接取られないため安全性が高まります。
- 認証は「入力されたパスワードのハッシュ値」と「保存してあるハッシュ値」を比較するだけで済みます。両者が一致すれば入力が正しいと判断できます。
したがって、 保管すべきは「パスワードのハッシュ値」であり、認証時にハッシュ化する対象も「入力されたパスワード」でなければなりません。
解法ステップ
- まず「何を保存すべきか」を問うていると確認する:パスワードの扱い(保存と照合)についての問題。
- 安全な実務原則を思い出す:パスワードは平文で保存しない、代わりにハッシュで保存する。
- 認証時に比較すべきは「保存済みハッシュ」と「入力パスワードを同じ方法でハッシュした値」。
- 選択肢のうち、保存しているものと認証時にハッシュ化して比較している対象が一致するものを選ぶ。これが ウ です。
選択肢別の誤答解説
-
ア: 「パスワードに対応する利用者IDのハッシュ値を登録しておき、認証時に入力されたパスワードをハッシュ関数で変換して比較する。」
→ 保存しているのは利用者IDのハッシュで、認証時にハッシュ化しているのはパスワードです。比較対象が異なるため成り立ちません。利用者IDとパスワードは別物です。 -
イ: 「パスワードに対応する利用者IDのハッシュ値を登録しておき、認証時に入力された利用者IDをハッシュ関数で変換して比較する。」
→ これは利用者ID(ユーザー名)を検証する方法であり、パスワード認証にはなりません。IDの一致だけで本人確認するのは不十分です。 -
ウ: 「パスワードをハッシュ値に変換して登録しておき、認証時に入力されたパスワードをハッシュ関数で変換して比較する。」
→ 正解。保存値と認証時に比較する値が同じ種類(パスワードのハッシュ)になっており、安全性・実務運用の観点でも妥当です。
補足:実装では単にハッシュ化するだけでなく、ランダムなソルト(後述)や反復処理・専用のパスワードハッシュ関数(bcrypt, Argon2 など)を使います。 -
エ: 「パスワードをハッシュ値に変換して登録しておき、認証時に入力された利用者IDをハッシュ関数で変換して比較する。」
→ 保存しているのはパスワードのハッシュなのに、認証時に利用者IDをハッシュしているため一致しません。目的が食い違っています。
よくある誤解
-
「ハッシュ化すれば何でも安全」
- 単純な高速ハッシュ(例:SHA-1、SHA-256)をそのまま使うと、総当たり(ブルートフォース)や辞書攻撃に弱いです。パスワード用には計算コストを上げるPBKDF2やbcrypt、Argon2などを使う必要があります。
-
「ユーザーIDもハッシュ化すれば安全」
- ユーザーIDは検索・管理しやすくするために平文で格納されることが多いです。ハッシュ化すると検索や管理が難しくなり、ハッシュ化の目的(秘密情報の保護)にも合わないことがあります。必要なら別途検討します。
-
「ハッシュ値をそのまま保存すればOK」
- 同じパスワードは同じハッシュになるため、複数ユーザーが同じパスワードを使っていることが分かってしまいます。対策として各ユーザーに固有のソルト(ランダムな値)を付けてハッシュ化します。
補足コラム
- ソルト(salt):パスワードに付けるランダムなデータ。予め生成してデータベースに保存します。意味は「塩」で、同じパスワードでもソルトが違えばハッシュ値が異なります。これによりレインボーテーブル(既知のハッシュ値とパスワードの照合表)攻撃を防げます。
- ストレッチング(反復処理):同じハッシュを多数の計算で遅くすることで、攻撃者の総当たりを遅らせます。PBKDF2、bcrypt、scrypt、Argon2が代表的です。
- 実務上の運用例:ユーザー登録時にランダムソルトを生成し、ソルト+パスワードをPBKDF2等でハッシュして保存。認証時は保存されたソルトを取り出して同じ処理を行い、ハッシュが一致すれば合格とする。通信はTLSで保護し、ログイン試行回数制限や二要素認証(2FA)も併用します。
- 実装上の注意:独自に暗号実装を作らず、信頼できるライブラリやフレームワークの機能を使うこと。例えば言語ごとのパスワードハッシュライブラリ(bcrypt 等)を利用します。
コード例(Python、bcryptを使った簡単な流れ)
import bcrypt
# パスワードのハッシュ化(登録時)
password = b"ユーザーの入力パスワード"
salt = bcrypt.gensalt() # ランダムソルト生成
hashed = bcrypt.hashpw(password, salt) # ハッシュ値(保存する)
# 認証時の確認
input_pw = b"認証時に入力されたパスワード"
if bcrypt.checkpw(input_pw, hashed):
print("認証成功")
else:
print("認証失敗")
FAQ
Q. なぜ平文で保存してはいけないのですか?
A. データベースが漏えいしたときに、攻撃者がそのままパスワードを使えると被害が大きいためです。ハッシュ化しておくと、漏れてもすぐには平文を得られません。
A. データベースが漏えいしたときに、攻撃者がそのままパスワードを使えると被害が大きいためです。ハッシュ化しておくと、漏れてもすぐには平文を得られません。
Q. ソルトはどこに保存しますか?
A. ソルトはハッシュ値と一緒に保存します。ソルト自体は秘密にする必要はなく、ハッシュ化時に使うために保持しておきます。
A. ソルトはハッシュ値と一緒に保存します。ソルト自体は秘密にする必要はなく、ハッシュ化時に使うために保持しておきます。
Q. SHA-256だけではダメですか?
A. 短いパスワードや使い回しのパスワードに対しては弱いです。計算を遅くする仕組み(PBKDF2、bcrypt、Argon2など)を使うのが推奨されます。
A. 短いパスワードや使い回しのパスワードに対しては弱いです。計算を遅くする仕組み(PBKDF2、bcrypt、Argon2など)を使うのが推奨されます。
関連キーワード: パスワードハッシュ、ソルト、レインボーテーブル、PBKDF2、bcrypt、Argon2、ハッシュ関数、ストレッチング、二要素認証、TLS

\ せっかくなら /
情報セキュリティマネジメントを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

