C Sharpens you up

http://qiita.com/yuba に移しつつあります

パスワード情報に暗号鍵を格納する

考え中。とりとめゼロ。

普通ユーザー管理DBにはパスワードのハッシュ値しか格納しないで、この情報はユーザー認証というか、パスワードがあってるかどうかの判定にだけ使う。

で、それとは関係なく。

ユーザー管理下のデータをすべて暗号化して格納してくれという要件がきた場合、暗号鍵をどう管理するかが問題。まず要件からして、暗号鍵はユーザーごとに違っているのは前提条件だから、アプリケーション側にハードコードってアプローチは取れない。

ってことでDBに暗号鍵を格納する?

通帳と印鑑を一緒に保管しちゃいけないように暗号化データと暗号鍵を一緒に保管するのもおかしい。もっとも印鑑と違って暗号鍵を暗号化することは可能で、そのメタ暗号鍵の方はハードコードってやり方でもいいかもしれない。たぶんこの辺が普通の落としどころ。

でもやっぱり、アプリケーションにハードコードとかいう以前にグローバル暗号鍵の存在そのものがいただけない。これが何かの具合に漏れたら取り返しがつかないから。

つまり目指す理想はユーザーごとに別々の暗号鍵を持たせつつ、その鍵の秘匿性はユーザーの手にだけ委ねたいということ。

で、最初に戻る。パスワードデータに暗号鍵の秘匿性も任せられないかという試み。
たとえば

  • パスワードデータとして保存するのは、ハッシュ(正解パスワード+ソルトA)
  • データを暗号化・復元する暗号鍵は、ハッシュ(正解パスワード+ソルトB)をメタ暗号鍵として暗号化して、保存しておく
  • パスワードを変更する場合、変更前パスワードも必ず入力してもらう(これは当然のこと)。変更前パスワードを使って暗号鍵を復元し、新しいパスワードのハッシュを使って再暗号化して保存する。

このやり方の問題は、パスワードリセットができないことだ。
いや、この方式の問題というか、秘匿性をユーザーの手だけに委ねようという考え方である以上当然の帰結なんですかね。