時刻を用いたトークン生成
パスワード再設定用 URL に含めるトークンを,次の擬似コードの処理で生成している。利用者 ID は他の利用者にも知られ得るものとする。
t = int(time.time()) # 現在時刻(秒単位)
token = sha256(user_id + ":" + str(t)).hex()
save(user_id, token, expires = t + 1800)この処理に関する記述として,適切なものはどれか。
- アSHA-256 は衝突困難性をもつので,利用者ごとに異なるトークンが生成され,第三者がトークンを推測することも困難である。
- イ攻撃者は,標的の利用者 ID で再設定を要求し,要求した時刻の前後の各秒について同じ計算をすれば,少ない試行でトークンを特定できる。
- ウSHA-256 を SHA-512 に替えれば,トークンの長さが 2 倍になるので,攻撃者がトークンを推測するために必要な試行回数も十分に増える。
- エ時刻の代わりに,プログラムの起動時刻をシードとしたメルセンヌ・ツイスタの出力を連結すれば,暗号論的に安全なトークンになる。
正解と解説を見る
正解 イ
この問題の基礎知識
- ハッシュ関数は同じ入力からは常に同じ値を出力するので,入力を推測できれば出力も再現できる。推測に必要な試行回数は入力の候補数で決まり,出力の長さでは変わらない。
- 衝突困難性は,同じハッシュ値をもつ異なる二つの入力を見つけることが困難であるという性質であり,入力が推測できる場合の出力の予測困難性を保証するものではない。
- パスワード再設定トークンやセッション 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 件)
- イ(正解): 時刻など攻撃者が観測できる状態から値を予測できる弱点(CWE-341)
A number or object is predictable based on observations that the attacker can make about the state of the system or network, such as time, process ID, etc.
CWE-341 · Description(新しいタブで開きます) - ア(誤り): 衝突困難性は衝突を見つけにくい性質であり,入力が推測できるときの予測困難性は含まない
An expected property of a cryptographic hash function whereby it is computationally infeasible to find a collision
NIST CSRC Glossary(collision resistance) · Definitions(新しいタブで開きます) - イ(正解)の対策・エ(誤り): 再設定用トークンは暗号論的に安全な乱数生成器で生成する
Generated using a cryptographically secure random number generator .
OWASP Forgot Password Cheat Sheet · General Security Practices(新しいタブで開きます) - エ(誤り): 時刻をシードとする統計的 PRNG は予測され得る例として挙げられている
Both of these examples use a statistical PRNG seeded with the current value of the system clock to generate a random number:
CWE-338 · Demonstrative Examples(新しいタブで開きます) - エ(誤り): 統計的 PRNG(メルセンヌ・ツイスタ等)の出力は予測可能で,セキュリティ用途に適さない
Statistical PRNGs provide useful statistical properties, but their output is highly predictable and forms an easy to reproduce numeric stream that is unsuitable for use in cases where security depends on generated values being unpredictable.
CWE-330 · Background Details(新しいタブで開きます)
トークンは sha256(user_id:t) で決まり,user_id は既知,t は要求時刻の前後数秒に絞れるので,候補は数個〜数十個である。推測の手間は入力の候補数で決まり,ハッシュの出力長(ウ)や衝突困難性(ア)では増えない。