18章「暗号関連」の対策ポイントと例題
18章「暗号関連」からは本番40問中1問が出ます。ハッシュと乱数の使い分けを問う、出題数の最も少ない章です。
- hashlib
- hmac
- secrets
- base64
- cryptography
この章の出題数と位置づけ
18章「暗号関連」からは本番40問のうち1問が出題されます。 全体に占める割合は2.5%で、15章中14番目タイの出題数です(同じ1問の章が他に1章あります)。 合格に必要なのは28問正解(12問まで不正解可)なので、 この章の1問をどこまで取りに行くかは、他の章との兼ね合いで決めるのが現実的です。
対策のポイント
- hashlib のハッシュは不可逆で、元に戻せません。暗号化(戻せる)との区別が問われます。
- hashlib.sha256 には bytes を渡す必要があり、str をそのまま渡すとエラーになります。
- パスワードやトークンの生成には random ではなく secrets を使う、という点が狙われます。
- base64 は暗号ではなくエンコード方式である、という基本の区別も範囲です。
- 1問しか出ないため、上の4点以上には踏み込まない判断も有効です。
この章の例題(3問)
当サイトで実際に出題している問題から3問を、正解と解説つきで掲載します。 すべて自作のオリジナル問題で、実際の試験問題ではありません。
例題1. パスワードリセット用トークンなど、推測されては困る値を生成したい。使うべき標準モジュールはどれか。
- 正解secrets
- random
- hashlib
- uuid
解説: secrets は暗号学的に安全な乱数を提供する(token_hex、token_urlsafe など)。random はメルセンヌツイスタによる擬似乱数で予測可能なため、この用途には使ってはいけない。hashlib はハッシュ計算であって乱数生成ではない。uuid は重ならない ID を作るもので、秘密の値のためのものではない。
例題2. 実行結果として正しいものを選べ。
import hashlib
print(hashlib.sha256("abc").hexdigest())
- 正解TypeError
- 64文字の16進文字列が表示される
- 32文字の16進文字列が表示される
- b' で始まる bytes が表示される
解説: ハッシュ関数はバイト列しか受け付けないので、文字列は "abc".encode() のように符号化してから渡す必要がある。正しく渡した場合、hexdigest() は16進の文字列(sha256 なら64文字)、digest() は bytes を返す。update() で分けて与えても、連結して一度に渡した場合と同じ結果になる。
例題3. secrets.token_hex(16) が返す文字列の長さはどれか。
- 正解32文字
- 16文字
- 8文字
- 22文字
解説: 引数は生成するバイト数であって、文字数ではない。16進表記では1バイトが2文字になるため32文字になる。同じ16バイトでも token_urlsafe(16) は Base64 系の符号化なのでちょうど22文字と長さが変わる。
この章は当サイトに全8問を収録しています。残りはドリルの「章別に解く」から解けます。