項 1 / 13
目的と使う場面を知る
何ができるようになるか、何のために学ぶかを確認します。
今回できるようになること
保存値が異なり、各ソルトを使った照合はどちらも成功する。
この節で学ぶ理由と、前後の節とのつながり
このセクションの位置づけ
なぜ、今これを学ぶのか
会員サイトの登録処理を引き継ぎました。動作確認用の記録にパスワードをそのまま残しており、誤入力でも古い記録が更新されます。アカウントの使い方との基本を学んだ知識で、保存する側の処理を見直します。
この後、何につながるか
保存する情報を減らす考え方を使い、次は個人情報の収集と共有範囲を考えます。
実務では、どんな場面?
この節の本文で学んだことを、同じ架空パスワードでも保存値を分ける実習で確かめます。扱う情報は配布した架空データだけです。
読み始める前に:この節の前提と言葉
同じパスワードを二人が使った場合に、保存する計算結果を比べます。本文では保存時の情報漏えいや更新条件も扱い、この実習では別のソルトを計算へ渡す効果を確かめます。
- ソルト
- 予測しにくい値を登録ごとに作り、パスワードの計算へ一緒に渡す補助の値
- パスワードとソルトから計算回数を指定して検証値を作る方式です。今回のPython実習では別方式のscryptを使います。p-13での計算費用を比較します。
- 検証値
- 入力が正しいか比較するために保存する計算結果
会員登録を受けるサーバーは、次回の入力が正しいか確かめる必要があります。しかし、元のパスワードを後で読み出す必要は通常ありません。利用者名とパスワードをそのまま保存すると、その一覧を読まれた時点で秘密が分かります。使い回しがあれば別サービスにも被害が広がります。へのアクセス制限に加え、漏れた場合の被害を小さくする保存方式が必要です。入力を丸ごとコピーする処理では、debugInputというデバッグ用の値、、バックアップにも秘密が残ります。保存してよい項目を先に決めます。の資格情報ファイルも、一覧形式が似ているだけで平文保存だと判断せず、実際の保存値を調べます。
矢印の順に、何が行われるかを読みます。
- 利用者が入力:サーバーは今回の秘密を受け取る
- 保存する項目を選ぶ:デバッグ用の原文やログには残さない
- 検証用の記録:方式・回数・ソルト・検証値を保存
保存方式だけでなく、ログやバックアップへ原文をコピーする処理も確認します。
- 方式・費用・ソルト・検証値を保存
- 今回の入力を保存条件で計算
- 正しい場合だけ受け入れる
- 古い設定なら新しい記録を作る
は入力から一定の長さの値を計算する仕組みです。「aで始まる単語は1」という規則ではappleもavocadoも同じ値になり、秘密の確認には使えません。「文字数を4で割った余り」でもcrewとdeskを区別できません。学的には原文を見つけにくい等の性質がありますが、値が長く見えるだけで安全と判断しません。登録時に作った検証値を保存し、ログイン時は今回の入力を同じ条件で計算して比較します。登録時の値を2回計算して比べると、今回の入力が間違っていても通ります。空文字同士の計算結果が一致することと、空文字を登録してよいことも別です。
並んだ項目を見比べ、違う点と同じ点を読み取ります。
- 登録時:登録した入力から検証値を保存する
- ログイン時:今回の入力を計算し、保存値と比べる
登録時の入力を2回比べても、今回の入力が正しいことは確認できません。
攻撃者が検証値の一覧を手元に持つと、候補の文字を自分の機械で計算して比べられます。これはサービスへ通信せず行うオフラインの推測です。ログイン画面で10回までと制限しても、その計算には適用されません。辞書の語や短い候補を先に計算した対応表を使う方法もあります。レインボーテーブルは厳密には連鎖によって計算時間と記憶容量を調整する方式で、単純な全件の対応表とは異なります。出力が長くても、入力が11111111なら早く試されることがあります。方式の名前を秘密にするのでなく、公開されていても一候補の計算に費用がかかるようにします。
並んだ項目を見比べ、違う点と同じ点を読み取ります。
- オンライン:サイトへ要求するので回数を制限できる
- オフライン:手元の一覧へ候補を計算し、サイトへ送らない
ログイン画面の回数制限だけでは、持ち出された一覧への候補照合を止められません。
ソルトはパスワードと一緒に計算へ渡す補助の値です。同じ秘密でもソルトが違えば保存値が変わり、一つの事前計算を全員に使い回しにくくなります。方式・計算費用・検証値とともに保存し、計算へ実際に渡します。
ソルトは秘密でなくて構いません。別の場所で秘密として管理するpepperとは異なります。本番では登録ごとに十分な長さの乱数を生成しますが、この実習のdemo-salt-Aとdemo-salt-Bは、違いを再現して比べるための固定値です。固定値を本番の生成方法として使いません。ソルトがあっても推測しやすい秘密への候補照合は残ります。
- 同じパスワード
- 別々のソルトを加えて計算
- 保存値が別になる
ログインのたびに新しいソルトで比較すると、正しい入力でも保存値と一致しません。検証するときは、その利用者の記録から方式・費用・ソルトを読み、今回の入力へ適用します。新規登録やパスワードの変更で新しい記録を作るときは、新しいソルトを使います。方式識別子・費用・ソルト・検証値を一つの文字列にまとめる形式も、別々の列にする形式もあります。古い方式の先頭2文字の例や、$y$のような識別部分を、すべての方式の共通書式と考えないでください。
矢印の順に、何が行われるかを読みます。
- 記録を読む:方式・回数・ソルトを取得
- 今回の入力を計算:読み出した同じ条件を使う
- 保存値と比べる:一致したかで受け入れを決める
比較の途中で新しいソルトに変えると、正しい入力でも保存値と一致しなくなります。
を一回かける処理は高速で、パスワード候補を大量に試されやすいため、保存方式としては不十分です。独自の繰り返しを足すのでなく、用途に合う検証済みの方式とライブラリを使います。
今回のPython実習は専用方式のscryptを使います。は別の方式で、計算回数を比べる実習は本編p-13で扱います。教材の費用設定は観察のための条件です。本番では方式の推奨設定、同時ログイン時の負荷、利用者の待ち時間を別に確認します。
- 専用方式を選ぶ
- 計算費用を設定
- 安全性と待ち時間を確認
費用設定が古い場合も、最初は保存記録に書かれた旧設定で今回の入力を検証します。正しい入力で、かつ更新が必要な場合にだけ、新しいソルトと費用設定で記録を作り直します。前に更新すると、誤入力で本人の記録が書き換わります。目標回数が現在より小さい場合に、わざわざ弱い設定へ戻すこともしません。実際のサービスでは同時更新、保存の失敗、の失効も別に検証します。原文を復元する工程はありません。
最初の問いに「はい」か「いいえ」で答え、対応する矢印をたどります。
- 今回の入力は正しい?:保存済みの条件で比較する
- 正しい:受け入れ、旧設定なら新しいソルトで更新
- 間違い:拒否し、保存記録を維持する
正しい場合も更新が不要なら記録を維持します。現在より小さい回数へ戻しません。
不可逆な検証値だけを保存しているなら、通常は以前のパスワードを取り出してメールで返せません。期限付きの回復手続きで、新しい秘密を設定する方法を用意します。一覧の漏えいでは、確認できた事実と未確認事項を分けて担当部署へ報告し、影響調査、秘密やの失効、利用者への説明を進めます。通知義務は国・業種・状況で異なるため担当者が確認します。技術詳細の公開も関係者と調整します。また、安全な保存方式だけでは、入力を変換する前の端末・サーバー・偽ページでの窃取は防げません。通信、端末、アプリ、秘密を記録しない設計を併せて確認します。
並んだ項目は、別々に確認する観点です。操作する順番ではありません。
- 入力前後の端末:偽ページや窃取への対策
- 通信とサーバー:通信保護とログへの記録防止
- 忘却・漏えい時:回復・失効・影響確認を別に用意
検証値から原文を取り出して返すのでなく、新しく設定する回復手続きが必要です。
実習のexercise.pyは二人分の同じ架空パスワードを計算します。最初は二人のソルトも同じです。二人目のソルトだけを変えて保存し、再実行します。
「同じ保存値」は二人の値が同じか、「各ソルトで再計算できる」は保存した条件で本人の照合ができるかを表します。前者が、後者がになる理由を説明してください。原文を取り出す処理ではありません。前の説明にある更新条件や回復は実務上の別の論点で、この実習に入力欄はありません。
- 二人目のソルトだけを変える
- scryptで再計算
- 保存値の違いと照合成功を確認
別の条件で使う準備
別の利用者、異なる費用設定、誤入力・正常入力・更新不要の場面でも、検証と更新を分ける。
- 今回の目標回数と保存済みの回数を読み、更新が必要か判断します。
- 原文を残さず、今回の入力を保存した条件で検証する設定にします。
- 誤入力では拒否して記録を維持し、正しい場合も回数を下げないことを確かめます。
ここでは実務で条件が増えた場合の考え方も紹介しました。今回の実習で操作する範囲は、次の「自分のパソコンで確かめる」で確認します。追加の別課題を提出する必要はありません。
同じ架空パスワードでも保存値を分ける
本文の知識を、この実習でどう使うか
ソルトはパスワードと一緒に計算へ入れる補助の値です。同じ秘密でもソルトを変えると保存値を分けられます。
- 同じ秘密と別のソルト
- scryptで計算
- 保存値と再計算を比較
結果が違ったときに考えること:保存値が違っても本人の照合は成功させます。照合時には、その記録を作ったときのソルトを使います。
保存値が異なり、各ソルトを使った照合はどちらも成功する。
WindowsまたはMacの操作手順、準備に失敗したときの確認方法、実行コマンドは実習画面に用意しています。ページ下部の「準備から実習を始める」から進んでください。
この実習の架空データで確認した結果です。実際の利用者や本番システムの安全性を保証しません。