MW211 EXIT

devlog
PHP/パスワード管理(1)
2014年10月18日
設定パスワードは平文で管理していては流出した時にすぐばれてしまうので
復号化できない暗号文の状態で保存しておくのが鉄則。

パスワード照合の場面では、入力された平文のパスワードを同様に暗号化、
お互い暗号文の状態として、そこで一致すれば、合格ということになる。

もし、暗号化された設定パスワードを流出し、誰かの手に渡っても
パスワード入力の場面で、それをそのまま使うとさらに暗号化されてしまい
別な文字になるので、照合できなくなる。

つまり、暗号化せずに照合するか、平文に戻して入力するかの
いずれかの方法をとらねば照合できないわけだ。
ところが、前者はもちろんシステムの問題だから手が出せない(*1)。
一方、後者は復号化できない暗号化がなされているので、無理ということになる(*2)。
  *1:但し、そういう機能が存在した場合には、そのルートをみつけだせばよい。
      よって、パスワード照合機能を実装する場合には注意が必要だ。
  *2:従って、元々のパスワードがなんだったかの問い合わせには回答できない。
      よって、パスワードを忘れた場合には、再発行ということになる。

ということで、復号化できない暗号化により、パスワードは強固なものになる。
で、その実現方法。
ハッシュ関数を使う。
まさにこれにうってつけの関数なのだ。

まず、バラバラに暗号化される。つまり、隣の文字(例えば「1」と「2」)でも
まったく関係のない文字に変換される。つまり、類推が難しい。

そして、復号化できない。
大雑把にいえば、例えば、どんな文字でも、必ず「松」「竹」「梅」に変換されるとして
「松」は元々何という文字だったか?というような仕組みだ。
もちろん、「鶴」と入力しても「亀」と入力しても「松」では、
パスワードとして不安を感じるが、この衝突が起こらない程度に大きな範囲で
変換されるのがハッシュ関数といえる。
#理論的には衝突が起きる可能性があることが復号化できないことにつながるが
  事実上は衝突が起きないという感じか。
分類:PHP