パスワード保存

パスワードの保存方法としてはこんな感じか。

  • 平文
  • ハッシュ化
    • salt付き
    • stretchする
  • 暗号化
    • (共通鍵)暗号
    • ハッシュ+暗号
    • 鍵付きハッシュ

どの方法が好ましいかは場合によるけど、平文と言う選択肢はまずないでしょう。また、ハッシュ化も単純(salt・stretchなし)では総当たりによる解析が現実的な時間で可能(ハッシュ値が分かっているオフライン解析の場合)であるため選択肢になりえない。
暗号化は使用する鍵をどう保存するかによる。パスワードと同じような方法で保存している(同じような手段で盗み出せる)場合は、選択肢から避けるか保存方法を再考する必要がある。

オンラインによる攻撃に関しては、アカウントロックを行う。ただし、逆総当たり(パスワードを固定しIDを変えて試行する)やジョーアカウント検索(IDとパスワードが同じユーザ)があるので、他にも対策は必要となる。

平文で保存

パスワードを平文(入力された内容そのまま)で保存する。

内容がそのまま保存されるので、パスワードを保存しているDBやファイルが何かの(クラッキング不正アクセス、情報漏洩 etc)拍子に漏れた場合、パスワードの内容が漏れてしまう。

ハッシュ化パスワードで保存

パスワードを暗号学的ハッシュ関数を用いてハッシュ値を求めその値を保存する。パスワード照合は、同様にハッシュ値を求め同じハッシュ値になるかで照合する。

ハッシュ値から元のパスワードを求めることは不可能であるため、ハッシュ値が漏れても元のパスワードを知られる心配はない(つまりパスワードが分からなくなった時に調べることも出来ない)。

ただし、ハッシュ関数は容易に計算ができる様になっているため、時間をかけ使用出来る文字を総当たりで計算し一致するものを求めることで元のパスワード知ることが出来る。

また、同じパスワードであれば同じ値となるため、同一の値であるものは同じパスワードであることが分かってしまう。

salt付きハッシュ化パスワードで保存

ハッシュ化する際に適当な値を付加してからハッシュ値を求める。

ソルトを付けることによって総当たりで計算する量を増やすことが出来る(例えば、4文字のパスワードに2文字のソルトを付けた場合、計6文字分の計算を行うことになる。ただ、ソルトが分かった場合は効果が薄い)。

また、異なるソルトを使うことで同一のパスワードであっても異なるハッシュ値となる(この場合ランダムでなくてもユーザーごとに異なれば十分)。

ランダムなソルトを使用する場合、照合する際にも必要となるため、そのソルトの値をどこか(たとえばパスワードと共に)に保存する必要がある。

stretchしたハッシュ化パスワードで保存

ハッシュの計算を複数回繰り返し行ってハッシュ値を求める。

計算を繰り返すことでハッシュ値を求めるのに時間をかけさせる。時間をかけさせることで総当たりで求めるのにかかる時間を延ばすことが出来る(400億計算出来るとする場合、1000回繰り返すと4000万個分の試行となる)。

共通鍵暗号方式でパスワードを暗号化して保存

パスワードを共通鍵暗号を用いて暗号化し保存する。

十分に強度のある暗号を用いて、鍵の管理が安全に行われれば、保存されたパスワード情報だけではパスワードを知ることは出来ない。

パスワードの保存・照合するためには鍵が必要となるが、この鍵を漏れないように管理する必要がある。パスワード情報と鍵が漏れれば、復元できパスワードを知ることができる。

ハッシュ+暗号

パスワードをハッシュ化した後に暗号化を行う。

鍵があってもハッシュ化されているため、生のパスワードを知ることは出来ない。

鍵付きハッシュ

パスワードと秘密鍵をくっつけてハッシュ化する(でいいんだっけ?)。