39. 安全なパスワード管理アルゴリズムを考えている
プライベートで少し作りたいものが出てきて、その中でパスワードを管理する必要があります。これは、以下の要件をセキュアに満たす必要があります。
上3つは何とでもなるのですが、最後の「実装を全公開する」という条件が結構キツいです。ただ、よく考えるとこれ ssh-agent のことなんですよね。
…と思って調べてみると、同じようなことを考えている人がいました。
実装に関してはこれが参考になりそうです。ただ、どのように暗号化しているか、という点は触れられていないです。
この点に関しては、以下のようにすれば良いのではないかと考えています。
- agent のメモリ内で、マスターパスワードで暗号化されたパスワード集合を保持する
- 本アプリでマスターパスワードを入力し、暗号化されたマスターパスワードと salt を添えて、agent へ問い合わせる
- agent でマスターパスワードの照合に成功すれば、「マスターパスワード+ワンタイムパスワード」の文字列をキーに暗号化されたパスワード集合とワンタイムパスワードを返す
- 本アプリで、マスターパスワードとワンタイムパスワードを利用してパスワード集合を復号する
安全性を高めるため、同一のパスワード集合でも毎回異なる結果を返し、復号にはマスターパスワードとワンタイムパスワードの両方を必要とします。
本アプリのメモリ内でパスワード集合を保持できるので、利用者は毎回マスターパスワードを入力する必要はありません。また、こちらで保持するものも暗号化しておいた方が良いでしょう。
マスターパスワードが流出する可能性としては、今のところ以下が穴として考えられます。
これを回避するには、agent 起動時にもマスターパスワードを要求し、初回通信のマスターパスワード暗号化で「マスターパスワード+salt」をキーとすれば良さそうです。ただ、もう少し利便性を高める方法がありそうな気もするので、考えてみています…。