SC Workbook
科目 A-2 · セキュリティ

時刻を用いたトークン生成

パスワード再設定用 URL に含めるトークンを,次の擬似コードの処理で生成している。利用者 ID は他の利用者にも知られ得るものとする。

t = int(time.time())  # 現在時刻(秒単位)
token = sha256(user_id + ":" + str(t)).hex()
save(user_id, token, expires = t + 1800)

この処理に関する記述として,適切なものはどれか。

  1. アSHA-256 は衝突困難性をもつので,利用者ごとに異なるトークンが生成され,第三者がトークンを推測することも困難である。
  2. イ攻撃者は,標的の利用者 ID で再設定を要求し,要求した時刻の前後の各秒について同じ計算をすれば,少ない試行でトークンを特定できる。
  3. ウSHA-256 を SHA-512 に替えれば,トークンの長さが 2 倍になるので,攻撃者がトークンを推測するために必要な試行回数も十分に増える。
  4. エ時刻の代わりに,プログラムの起動時刻をシードとしたメルセンヌ・ツイスタの出力を連結すれば,暗号論的に安全なトークンになる。
正解と解説を見る

正解 イ

この問題の基礎知識

  • ハッシュ関数は同じ入力からは常に同じ値を出力するので,入力を推測できれば出力も再現できる。推測に必要な試行回数は入力の候補数で決まり,出力の長さでは変わらない。
  • 衝突困難性は,同じハッシュ値をもつ異なる二つの入力を見つけることが困難であるという性質であり,入力が推測できる場合の出力の予測困難性を保証するものではない。
  • パスワード再設定トークンやセッション ID など推測されてはならない値は,暗号論的擬似乱数生成器を用いて十分な長さのランダムな値として生成する。メルセンヌ・ツイスタなど暗号用途に設計されていない生成器は,シードや出力から以後の値を予測され得る。
アSHA-256 は衝突困難性をもつので,利用者ごとに異なるトークンが生成され,第三者がトークンを推測することも困難である。

衝突困難性は,同じハッシュ値をもつ異なる入力を見つけにくいという性質であり,入力が推測できる場合の予測困難性は保証しない。入力が利用者 ID と時刻だけなので,同じ計算をすればトークンを再現できる。

イ攻撃者は,標的の利用者 ID で再設定を要求し,要求した時刻の前後の各秒について同じ計算をすれば,少ない試行でトークンを特定できる。正解

トークンの入力が,攻撃者が知り得る利用者 ID と,観測できる発行時刻(秒単位)だけなので,候補は要求時刻の前後数秒分に限られる(CWE-341)。トークンは暗号論的擬似乱数生成器で生成したランダムな値にすべきである。

ウSHA-256 を SHA-512 に替えれば,トークンの長さが 2 倍になるので,攻撃者がトークンを推測するために必要な試行回数も十分に増える。

推測に必要な試行回数は入力の候補の数で決まり,ハッシュ関数の出力長では変わらない。入力が利用者 ID と時刻のままであれば,SHA-512 にしても同じ少ない試行で特定できる。

エ時刻の代わりに,プログラムの起動時刻をシードとしたメルセンヌ・ツイスタの出力を連結すれば,暗号論的に安全なトークンになる。

メルセンヌ・ツイスタは統計的な性質に優れた擬似乱数生成器であり,暗号用途の生成器ではない。起動時刻のシードも推測可能であり,出力を予測されるおそれがある(CWE-338)。

検証用の出典出典照合済み
CWE-341 Predictable from Observable State / CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG) / OWASP Forgot Password Cheat Sheet
照合の根拠(5 件)

トークンは sha256(user_id:t) で決まり,user_id は既知,t は要求時刻の前後数秒に絞れるので,候補は数個〜数十個である。推測の手間は入力の候補数で決まり,ハッシュの出力長(ウ)や衝突困難性(ア)では増えない。

問題 ID A2-SEC-0529 · AI 作成のオリジナル問題 · 正解と各選択肢の根拠を出典の原文で確認しています。 照合日 2026-11-08

非公式の学習用アプリです(IPA とは関係ありません)。問題はすべて AI が作成したオリジナルで、誤りを含む場合があります。