パスワードをハッシュ化して保存した場合、ハッシュアルゴリズムの陳腐化にどう対応するか。

経緯

パスワードをソルトつきハッシュ化してDBに保存するのがベストプラクティス…とは限らないという話 - kazuhoのメモ置き場とか関連記事斜め読みして、ハッシュ化したパスワードの取り扱いについていろいろ考えたんだけど、突っ込みのために記事をちゃんと読んだら思っていたこととぜんぜん関係ない、どうでもいい議論だった。

突っ込みの方はやめて、考えた、ハッシュ化したパスワードの取り扱いの方について書く。

本題

パスワードをハッシュ化するのは、復元不可能なため、生で保存したり暗号化して保存するよりも漏洩時の安全性が高いためである。

とは言っても以下の理由から、事実上は復元可能である。

  1. passwordという文字列をMD5でハッシュ化すると5f4dcc3b5aa765d61d8327deb882cf99というバイト列になる。
  2. ハッシュ化すると5f4dcc3b5aa765d61d8327deb882cf99になる文字列(バイト列)はpassword以外にも存在する。
  3. だが、その中でも人間がパスワードとして使用するであろう文字列はpasswordしかない。

復元をできる限り避けるために、以下のような方法が使われる。

  • ソルト付加。
  • ストレッチング。
  • 計算速度の遅いアルゴリズムの選択。

とはいえこれらの方法はすべて、計算時間の引き伸ばしの効果しかなく、そのためコンピュータの演算能力の向上で容易に陳腐化する。

陳腐化した場合も生で保存するよりは安全だが、暗号化に近い安全性に落ちてしまう。そして、平文で取り出せない分利便性が下がり、ハッシュ化していることのメリットがなくなる。

陳腐化にどう対処するか

ハッシュアルゴリズムをより計算の複雑なものにアップデートすればよい。ただしパスワードはハッシュ化されているので、平文で取り出すことはできない。暗号化であれば、新しい暗号アルゴリズムへのアップデートも可能である。

この辺がハッシュ化を選択しない一因となっているように思える。だが、ハッシュ化を選択した場合もハッシュアルゴリズムのアップデートは以下の方法で可能である。

  • パスワード入力自体は行われるので、それを使って新しいハッシュアルゴリズムでハッシュ化する。
    • パスワード入力が行われるまでハッシュアルゴリズムを更新できないという問題がある。
  • 既存のハッシュ化されたパスワードを、新しいハッシュアルゴリズムでさらにハッシュ化する。
    • 上の例で言うなら、5f4dcc3b5aa765d61d8327deb882cf99をさらにSHA-512でハッシュ化するような形である。
    • 普通に考えると危険性はないが、ハッシュアルゴリズムは詳しくないのでなにか問題があるかも。