基本情報技術者 2018年 春期 午後 問01
Webサービスを利用するためのパスワードを安全に保存する方法に関する次の記述を読んで、設問1〜3に答えよ。
A社が提供するWebサービスを利用するには、利用者が決めた利用者IDとパスワードを、Webアプリケーションが動作するサーバに登録しておく必要がある。A社のWebアプリケーションでは、利用者がWebアプリケーションにログインするときに、Webブラウザから利用者IDとパスワードがサーバに送信される。サーバは、受信した利用者IDとパスワードを、照合することによって認証する。利用者が決めたパスワードは、パスワードファイルに平文で保存されている。
近年、パスワードファイルが漏えいし、不正ログインが発生したと考えられる事件が多数報道されている。そこで、A社に勤めるCさんは、自社のWebアプリケーションにおけるパスワードファイルが漏えいした際の不正ログインを防止するための対策について、上司から検討を命じられた。
Cさんは対策として、パスワードを平文で保存するのではなく、ハッシュ関数でパスワードのハッシュ値を計算(以下、ハッシュ化という)し、そのハッシュ値を保存する方式を提案することにした。この方式におけるログイン時の認証では、受信したパスワードから求めたハッシュ値を、パスワードファイルに保存されているハッシュ値と照合する。パスワードの保存の流れと、照合の流れを図1に示す。

Cさんは、パスワードのハッシュ化には、ハッシュ関数の一つであるaを用いることにした。ハッシュ化に用いるハッシュ関数は、一般的に次のような特徴を備えているので、パスワードが一致していることの確認に用いることができる。また、利用者のパスワードを平文で保存する場合と比べて、パスワードファイルが漏えいしても、より安全だと考えたからである。
〔ハッシュ化に用いるハッシュ関数の特徴〕
(1) パスワードの長さに関係なく、ハッシュ値は固定長になる。
(2) b
(3) ハッシュ値からパスワードを推測することが非常に困難である。
(4) パスワードが1文字でも異なれば、ハッシュ値は大きく異なる。
設問1:
問題文を見る 本文中のに入れる適切な答えを、解答群の中から選べ。
aに関する解答群
ア:AES
イ:Diffie-Hellman
ウ:RSA
エ:SHA-256
オ:TLS
bに関する解答群
ア:異なるパスワードをハッシュ化したとき、同じハッシュ値になる可能性が高い。
イ:同一のパスワードをハッシュ化すると、同じハッシュ値になる。
ウ:パスワードをハッシュ化した結果のハッシュ値を再度ハッシュ化すると、元のパスワードになる。
エ:秘密鍵を使用してハッシュ値から元のパスワードを復元できる。
模範解答
a:エ、b:イ
解説
解答の導き方
設問は、パスワードをハッシュ化するための方式と、ハッシュ関数が備える性質を問うています。
まず、ログイン時の処理を確認します。図1では、サーバが受信したパスワードをハッシュ化し、パスワードファイルに保存されているハッシュ値と照合します。ハッシュ関数(入力から一定の長さの値を計算する仕組み)は、同じ入力に対して毎回同じ結果を返す必要があります。そうでなければ、正しいパスワードを入力しても、保存した値と照合できないからです。
この性質に当てはまるのは、bのイ「同一のパスワードをハッシュ化すると、同じハッシュ値になる」です。ハッシュ値は、パスワードから計算した結果の値です。アは、異なるパスワードから同じハッシュ値が高い確率でできるという内容ですが、そのような性質ではありません。ウやエのように、ハッシュ値から元のパスワードを復元できるわけでもありません。
次に、aにはハッシュ関数の名称が入ります。選択肢のうち、SHA-256(Secure Hash Algorithmの一つで、256ビットのハッシュ値を生成する方式)がハッシュ関数です。したがって、aにはエが入ります。
ほかの選択肢は、役割が異なります。AES(Advanced Encryption Standard)は、同じ鍵を使って暗号化・復号する方式です。Diffie-Hellmanは、通信相手と共通の鍵を安全に共有するための方式です。RSA(Rivest–Shamir–Adleman)は、公開鍵暗号方式の一つです。TLS(Transport Layer Security)は、通信を暗号化して保護する仕組みです。いずれも、ここで問われているハッシュ関数ではありません。
問題文にある「ハッシュ値からパスワードを推測することが非常に困難」という性質も、ハッシュ化と暗号化の違いを考える手掛かりです。暗号化は、鍵を使って元のデータに戻せるようにする処理です。一方、ハッシュ化は、元に戻すことを目的としません。保存したハッシュ値と、入力されたパスワードから新たに計算したハッシュ値を比べて、認証します。
誤りやすいポイント
- ハッシュ化を暗号化と同じものだと考えないようにしましょう。暗号化は鍵を使って元に戻せますが、ハッシュ化では元のパスワードに戻すことを目的としていません。
- 「同じパスワードなら同じハッシュ値になる」ことと、「同じハッシュ値なら必ず同じパスワードである」ことは同じではありません。異なる入力から偶然同じハッシュ値ができる可能性はありますが、適切なハッシュ関数では、その可能性が高いわけではありません。
- SHA-256はハッシュ関数の名称です。AESやRSAのような暗号方式、TLSのような通信を保護する仕組みとは役割が違います。
FAQ
Q: パスワードをハッシュ化して保存すれば、不正ログインを完全に防げますか?
A: 完全に防げるわけではありません。ハッシュ値からパスワードを直接求めるのは困難ですが、攻撃者が候補のパスワードを次々にハッシュ化して照合する可能性はあります。そのため、ハッシュ化は平文で保存するより安全にする対策ですが、それだけで安全が保証されるわけではありません。
A: 完全に防げるわけではありません。ハッシュ値からパスワードを直接求めるのは困難ですが、攻撃者が候補のパスワードを次々にハッシュ化して照合する可能性はあります。そのため、ハッシュ化は平文で保存するより安全にする対策ですが、それだけで安全が保証されるわけではありません。
Q: 図2のソルトは何のために使いますか?
A: ソルトは、パスワードに加えてからハッシュ化する値です。利用者ごとに異なるソルトを使うと、同じパスワードでも利用者ごとに異なるハッシュ値にできます。図2のように、照合時には保存しておいたソルトを読み出し、入力されたパスワードと組み合わせてハッシュ化します。
A: ソルトは、パスワードに加えてからハッシュ化する値です。利用者ごとに異なるソルトを使うと、同じパスワードでも利用者ごとに異なるハッシュ値にできます。図2のように、照合時には保存しておいたソルトを読み出し、入力されたパスワードと組み合わせてハッシュ化します。
関連キーワード: ハッシュ関数、ハッシュ値、SHA-256、ソルト、パスワード認証
設問2:
問題文を見る 次の記述中のに入れる適切な答えを、解答群の中から選べ。
Cさんは、自身が提案する方式について、社内の情報セキュリティ責任者にレビューを依頼したところ、この方式は漏えいしたパスワードファイルを攻撃者に入手された場合、事前計算による辞書攻撃に弱いという指摘を受けた。この攻撃では、あらかじめ攻撃者はパスワードとしてよく使われる文字列を、よく使われているハッシュ関数でハッシュ化し、ハッシュ値から元のパスワードが検索可能な一覧表を作成しておく。その後、攻撃者が漏えいしたパスワードファイルを入手したとき、この作成した一覧表からハッシュ値を検索する。ハッシュ値が一覧表に載っている場合は、元のパスワードを容易に知ることができる。
Cさんは、事前計算による辞書攻撃を難しくする方式を調査し、ソルトを用いる方式を提案することにした。ソルトとは、十分な長さをもつランダムな文字列である。
この方式におけるパスワードの保存では、まず、サーバは新しいパスワードの保存の都度、新しいソルトを生成し、ソルトとパスワードを連結した文字列をハッシュ化する。このとき得られるハッシュ値は、パスワードだけをハッシュ化した場合のハッシュ値c。次に、ハッシュ化に使用したソルトと得られたハッシュ値をパスワードファイルに保存する。
この方式におけるパスワードの照合では、まず、サーバはパスワードファイルからソルトとハッシュ値を読み出す。次に、読み出したソルトと受信したパスワードを連結した文字列をハッシュ化し、得られたハッシュ値を、読み出したハッシュ値と照合する。ソルトを用いたパスワードの保存の流れと、照合の流れを図2に示す。

ソルトを用いる方式が、事前計算による辞書攻撃の対策として効果があるのは、dからである。
cに関する解答群
ア:と同じ値になる
イ:とは異なる値になる
ウ:よりも長さが長い
エ:よりも長さが短い
dに関する解答群
ア:攻撃者が、ハッシュ値からではなくソルトから元のパスワードを検索するための一覧表を事前に作成しておく必要がある
イ:攻撃者がパスワードファイルからソルトを入手できない
ウ:攻撃者がパスワードファイルを入手するのが困難になる
エ:攻撃者が一つのパスワードに対して事前に求めるハッシュ値の数が膨大になる
模範解答
c:イ、d:エ
解説
解答の導き方
まず、cは「ソルトを加えてハッシュ化したときのハッシュ値が、パスワードだけをハッシュ化したときとどう違うか」を問うています。
ハッシュ関数(入力されたデータを一定の長さの値に変換する関数)に入れるデータは、ソルトを使わない場合はパスワードだけです。一方、ソルト(パスワードに加えるランダムな文字列)を使う場合は、ソルトとパスワードを連結した文字列です。図2でも、ソルトとパスワードをつなげてからハッシュ化しています。
つまり、ハッシュ化する入力が異なります。問題文には「パスワードが1文字でも異なれば、ハッシュ値は大きく異なる」とあります。ソルトを加えた入力はパスワードだけの入力とは異なるので、問題の想定では、ハッシュ値も異なると判断できます。したがって、cには「とは異なる値になる」が入ります。
「よりも長さが長い」「よりも長さが短い」は当てはまりません。問題文の特徴に「パスワードの長さに関係なく、ハッシュ値は固定長になる」とあるからです。ハッシュ値の長さは、入力にソルトを加えたかどうかでは変わりません。
次に、dを考えます。事前計算による辞書攻撃(よく使われるパスワード候補のハッシュ値をあらかじめ計算し、漏えいしたハッシュ値と照合する攻撃)では、同じパスワードなら同じハッシュ値になることを利用します。攻撃者は、よく使われるパスワードのハッシュ値をあらかじめ一覧表にしておけば、漏えいしたパスワードファイルのハッシュ値から元のパスワードを探せます。
しかし、ソルトを使うと、保存されるハッシュ値は「ソルトとパスワードを連結した文字列」から計算されます。さらに問題文には、新しいパスワードの保存の都度、新しいソルトを生成するとあります。そのため、同じパスワードでもソルトが異なれば、ハッシュ値も異なります。
攻撃者があらかじめ使い回せる一覧表を作るには、パスワード候補ごとに、ソルトのさまざまな値との組合せを計算しなければなりません。ソルトは十分な長さをもつランダムな文字列なので、その組合せは膨大になります。このため、dには「攻撃者が一つのパスワードに対して事前に求めるハッシュ値の数が膨大になる」という内容が当てはまります。
なお、ソルトはパスワードファイルに保存されるので、攻撃者が漏えいしたファイルを入手すれば、ソルトも読み出せます。ソルトを隠しておくことが対策の理由ではありません。事前に作った一覧表をそのまま使いにくくすることが、対策として効果をもつ理由です。
誤りやすいポイント
- ソルトを加えるとハッシュ値の長さが変わる、と考えないようにしましょう。ハッシュ値は固定長です。変わるのは、ハッシュ化する入力と、それによって得られるハッシュ値です。
- ソルトは秘密にするものだ、と考えないようにしましょう。図2のように、ソルトはハッシュ値とともにパスワードファイルに保存されます。
- ソルトを使えば、攻撃者がパスワードを推測できなくなるわけではありません。漏えい後にソルトを使ってパスワード候補を一つずつ試す攻撃は可能です。ソルトの主な効果は、事前に作った一覧表を使い回しにくくすることです。
- ソルトを使っても、パスワードファイル自体が漏えいしにくくなるわけではありません。ファイルを入手した攻撃者に対し、事前計算による辞書攻撃を難しくする対策です。
FAQ
Q: 同じパスワードを使っていても、利用者ごとにハッシュ値は変わりますか?
A: ソルトが異なれば、ハッシュ化する入力が異なるため、ハッシュ値も異なります。これにより、同じパスワードを使う人が複数いても、保存されるハッシュ値から同じパスワードだと分かりにくくなります。
Q: ソルトがパスワードファイルに保存されていても、効果はありますか?
A: はい。ソルトを隠すのではなく、パスワードとソルトの組合せごとにハッシュ値が変わることを利用します。そのため、ソルトを知らない段階で作った一覧表を、漏えいしたファイルの照合にそのまま使うことが難しくなります。
Q: ソルトを使えば、弱いパスワードでも安全になりますか?
A: いいえ。ソルトは事前計算による辞書攻撃を難しくする仕組みですが、弱いパスワードを推測されにくくするものではありません。パスワード自体を推測されにくくすることも大切です。
関連キーワード: ハッシュ関数、ハッシュ値、ソルト、辞書攻撃、事前計算
設問3:
問題文を見る 次の記述中のに入れる適切な答えを、解答群の中から選べ。
Cさんは、オフライン総当たり攻撃についても、対策を検討することにした。
漏えいしたパスワードファイルに対するオフライン総当たり攻撃とは、攻撃者が、パスワードファイルを入手した後、全てのパスワードの候補を逐次生成してはハッシュ化し、得られたハッシュ値がパスワードファイルに保存されているハッシュ値と一致するかどうか、しらみつぶしに確認することによって、ハッシュ値の元のパスワードを見つける攻撃方法である。
Cさんは、オフライン総当たり攻撃を難しくする方式として、ストレッチングという方式があることを知った。
この方式では、まず、ソルトとパスワードを連結した文字列をハッシュ化してハッシュ値を得る。次に、得られたハッシュ値の後にソルトとパスワードを連結し、その連結結果をハッシュ化する。この操作を指定した回数だけ繰り返すことによって、パスワードの照合に用いるハッシュ値を得る。パスワードファイルには、ソルト及びパスワードの照合に用いるハッシュ値に加えて、繰返し回数も保存する。この方式では、ハッシュ化の操作を1回だけ行う方式と比べると、攻撃者が、オフライン総当たり攻撃を行う際、。
解答群
ア:生成すべきパスワードの候補の最大文字列長が長くなる
イ:一つのパスワードの候補から求めたハッシュ値の長さが長くなる
ウ:一つのパスワードの候補から求めたハッシュ値を、パスワードファイルのハッシュ値と比較する回数が増える
エ:一つのパスワードの候補からハッシュ値を求める時間が増加する
模範解答
エ
解説
解答の導き方
この設問は、ストレッチングによって、攻撃者がパスワードの候補を1つ試すときに何が変わるかを問うています。
まず、オフライン総当たり攻撃では、攻撃者は漏えいしたパスワードファイルを使い、パスワードの候補を次々に試します。問題文には、候補をハッシュ化し、得られたハッシュ値をファイル内の値と照らし合わせるとあります。ハッシュ関数とは、入力から一定の長さの値を計算する仕組みです。
次に、ストレッチングの処理を確認します。問題文では、ソルト(パスワードに加えてハッシュ化する値)とパスワードを連結してハッシュ化し、その後も「得られたハッシュ値の後にソルトとパスワードを連結」してハッシュ化する操作を、指定した回数だけ繰り返すと説明されています。
つまり、攻撃者がパスワードの候補を1つ試すたびに、ハッシュ化を何度も行う必要があります。ハッシュ化を1回だけ行う方式より、候補1つ分の計算に時間がかかります。これをすべての候補について行うため、総当たり攻撃にもより多くの時間がかかります。
一方、パスワードの候補の長さが長くなるわけではありません。また、ハッシュ値は固定長なので、ハッシュ値の長さも長くなりません。候補について繰り返し行うのはハッシュ化であり、最後に得たハッシュ値を保存済みの値と照合します。照合の回数が繰返し回数と同じだけ増えるわけではありません。
したがって、当てはまるのは「一つのパスワードの候補からハッシュ値を求める時間が増加する」です。
誤りやすいポイント
-
ハッシュ値の長さが長くなると考える
ハッシュ化を繰り返しても、ハッシュ値の長さが長くなるとは限りません。問題文にも、ハッシュ値は固定長になるとあります。 -
パスワード候補の数が増えると考える
ストレッチングは、候補を増やす処理ではありません。候補を1つ試すための計算を重くします。 -
ハッシュ化の回数と照合の回数を混同する
繰り返すのはハッシュ化です。候補ごとに最後に得たハッシュ値を保存済みの値と照合します。
FAQ
Q: ストレッチングを使えば、総当たり攻撃を防げますか?
A: 攻撃を完全に防ぐものではありません。候補1つを試す時間を増やし、攻撃を難しくします。
A: 攻撃を完全に防ぐものではありません。候補1つを試す時間を増やし、攻撃を難しくします。
Q: ソルトとストレッチングは同じものですか?
A: 役割が異なります。ソルトはパスワードと一緒にハッシュ化する値で、ストレッチングはハッシュ化を繰り返して計算の手間を増やす方法です。
A: 役割が異なります。ソルトはパスワードと一緒にハッシュ化する値で、ストレッチングはハッシュ化を繰り返して計算の手間を増やす方法です。
Q: 繰返し回数もパスワードファイルに保存するのはなぜですか?
A: 認証時に、保存時と同じ回数だけハッシュ化を繰り返し、ハッシュ値を照合するためです。
A: 認証時に、保存時と同じ回数だけハッシュ化を繰り返し、ハッシュ値を照合するためです。
関連キーワード: ハッシュ関数、ソルト、ストレッチング、オフライン総当たり攻撃、パスワードファイル



