パスワードを安全に保存する方法【基本情報技術者試験 平成30年度 春期 午後 問1】

基本情報技術者試験 平成30年度 春期 午後 問1

問1 Webサービスを利用するためのパスワードを安全に保存する方法に関する次の記述を読んで、設問1〜3に答えよ。

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

f:id:aolaniengineer:20200326073813p:plain 
 Cさんは、パスワードのハッシュ化には、ハッシュ関数の一つである(a:SHA-256を用いることにした。ハッシュ化に用いるハッシュ関数は、一般的に次のような特徴を備えているので、パスワードが一致していることの確認に用いることができる。また、利用者のパスワードを平文で保存する場合と比べて、パスワードファイルが漏えいしても、より安全だと考えたからである。

a:SHA-256

SHA-256(Secure Hash Algorithm-256)は、256ビットのハッシュ値を出力するハッシュ関数です。2001年にNIST(米国標準技術局)によって標準化されたSHA-2の一部で、他にSHA-384、SHA-512などがありますが、SHA-256は実装面や、計算速度、安全性のバランスに優れ、最も広く普及しています。

その他の選択肢は以下のとおりです。

  • AES(Advanced Encryption Standard):共通鍵暗号方式の一つです。
  • Diffie-Hellman:鍵交換アルゴリズムの一つです。
  • RSA(Rivest-Shamir-Adleman cryptosystem):公開鍵暗号方式の一つで、巨大な素数同士を掛け合わせた整数を素因数分解するのが困難であることを利用したものです。
  • TLS(Transport Layer Security):暗号化通信プロトコルの一つです。

〔ハッシュ化に用いるハッシュ関数の特徴 

(1)パスワードの長さに関係なく、ハッシュ値は固定長になる。

(2)(b:同一のパスワードをハッシュ化すると、同じハッシュ値になる。

(3)ハッシュ値からパスワードを推測することが非常に困難である。

(4)パスワードが1文字でも異なれば、ハッシュ値は大きく異なる。

b:同一のパスワードをハッシュ化すると、同じハッシュ値になる。 

ハッシュ関数の特徴は上記のとおりです。

その他の選択肢は以下のとおりです。

  • 異なるパスワードをハッシュ化したとき、同じハッシュ値になる可能性が高い。:上記の特徴(4)のとおり、1文字でも異なれば、ハッシュ値は大きく異なります。
  • パスワードをハッシュ化した結果のハッシュ値を再度ハッシュ化すると、元のパスワードになる。:ハッシュ関数は一方向性の関数のため、ハッシュ値から元の値には戻りません。
  • 秘密鍵を使用してハッシュ値から元のパスワードを復元できる。:ハッシュ化では秘密鍵など暗号鍵を用いません。

 Cさんは、自身が提案する方式について、社内の情報セキュリティ責任者にレビューを依頼したところ、この方式は漏えいしたパスワードファイルを攻撃者に入手された場合、事前計算による辞書攻撃に弱いという指摘を受けた。この攻撃では、あらかじめ攻撃者はパスワードとしてよく使われる文字列を、よく使われているハッシュ関数でハッシュ化し、ハッシュ値から元のパスワードが検索可能な一覧表を作成しておく。その後、攻撃者が漏えいしたパスワードファイルを入手したとき、この作成した一覧表からハッシュ値を検索する。ハッシュ値が一覧表に載っている場合は、元のパスワードを容易に知ることができる。
 Cさんは、事前計算による辞書攻撃を難しくする方式を調査し、ソルトを用いる方式を提案することにした。ソルトとは、十分な長さをもつランダムな文字列である。
 この方式におけるパスワードの保存では、まず、サーバは新しいパスワードの保存の都度、新しいソルトを生成し、ソルトとパスワードを連結した文字列をハッシュ化する。このとき得られるハッシュ値は、パスワードだけをハッシュ化した場合のハッシュ値(c:とは異なる値になる)。次に、ハッシュ化に使用したソルトと得られたハッシュ値をパスワードファイルに保存する。

c:とは異なる値になる

ハッシュ化の特徴(4)のとおり、1文字でも異なればハッシュ値は大きく異なりますので、ソルトとパスワードを連結した文字列とパスワードのみの文字列では生成されるハッシュ値は大きく異なります。

 この方式におけるパスワードの照合では、まず、サーバはパスワードファイルからソルトとハッシュ値を読み出す。次に、読み出したソルトと受信したパスワードを連結した文字列をハッシュ化し、得られたハッシュ値を、読み出したハッシュ値と照合する。ソルトを用いたパスワードの保存の流れと、照合の流れを図2に示す。f:id:aolaniengineer:20200326082131p:plain

 ソルトを用いる方式が、事前計算による辞書攻撃の対策として効果があるのは、(d:攻撃者が一つのパスワードに対して事前に求めるハッシュ値の数が膨大になる)からである。

d:攻撃者が一つのパスワードに対して事前に求めるハッシュ値の数が膨大になる

事前計算による辞書攻撃については、「あらかじめ攻撃者はパスワードとしてよく使われる文字列を、よく使われているハッシュ関数でハッシュ化し、ハッシュ値から元のパスワードが検索可能な一覧表を作成しておくとあります。

「十分な長さを持つランダムな文字列」であるソルトを利用者ごとに異なる値で組み合わせるとすると、攻撃者はパスワードごとにソルトの組み合わせ数と同じハッシュ値を用意する必要があり、その数は膨大になります。

 Cさんは、オフライン総当たり攻撃についても、対策を検討することにした。
 漏えいしたパスワードファイルに対するオフライン総当たり攻撃とは、攻撃者が、パスワードファイルを入手した後、全てのパスワードの候補を逐次生成してはハッシュ化し、得られたハッシュ値がパスワードファイルに保存されているハッシュ値と一致するかどうか、しらみつぶしに確認することによって、ハッシュ値の元のパスワードを見つける攻撃方法である。
 Cさんは、オフライン総当たり攻撃を難しくする方式として、ストレッチングという方式があることを知った。
 この方式では、まず、ソルトとパスワードを連結した文字列をハッシュ化してハッシュ値を得る。次に、得られたハッシュ値の後にソルトとパスワードを連結し、その連結結果をハッシュ化する。この操作を指定した回数だけ繰り返すことによって、パスワードの照合に用いるハッシュ値を得る。パスワードファイルには、ソルト及びパスワードの照合に用いるハッシュ値に加えて、繰返し回数も保存する。この方式では、ハッシュ化の操作を1回だけ行う方式と比べると、攻撃者が、オフライン総当たり攻撃を行う際、一つのパスワードの候補からハッシュ値を求める時間が増加する

【出典:基本情報技術者試験 平成30年度 春期 午後 問1(一部、加工あり)】

一つのパスワードの候補からハッシュ値を求める時間が増加する

ストレッチングではハッシュ化の計算を数千回から数万回繰り返すため、攻撃者側でも一つのパスワード候補に対して同じ回数のハッシュ計算を行う必要があります。