パスワードマネージャーのパスワードリセット機能を実装するにはどうすればよいですか?私は現在、PBKDF2でハッシュされたハッシュ+ソルトマスターパスワードを保存し、マスターパスワード自体でパスワードを暗号化していますが、ユーザーがマスターパスワードを紛失した場合、これはパスワードを復号化できないことを意味します。
マスターパスワードで暗号化されたバージョンのパスワードと、ユーザーのメールで暗号化されたバージョンと、ユーザーがアカウントを作成するときに生成されるランダムトークンを保存することを考えましたが、これは安全ですか?これを行うときにベストプラクティスはありますか?
ユーザーのメールもハッシュとしてのみ保存されます。
私の質問を明確にするために、パスワードが失われた場合にパスワードで暗号化されたデータを回復するためのベストプラクティスはありますか?
[〜#〜]編集[〜#〜]
私の現在のアイデアは、すべてのパスワードを暗号化するための2番目のキーを生成し、ユーザーがUSBに保存できるステガノグラフィーによってこのキーを画像で暗号化することですが、すべてのパスワードはデータベースに2回保存されます(両方とも暗号化されます)。それがリスクかどうかわからない。
編集2
@ A.Herseanの回答を利用した最終バージョン。
すべてのパスワードが暗号化されたキーを生成します。このキー自体は、パスワードとバックアップパスワード(イメージ内に保存されます)で暗号化でき、キーのこれら2つの暗号化はデータベースに保存されます。
「質問を明確にするために、パスワードを紛失した場合にパスワードで暗号化されたデータを回復するためのベストプラクティスはありますか?」という質問に答えるには、パスワードを失っても暗号化されたデータを回復しないことがベストプラクティスです。暗号化のポイントはパスワードなしでは解読できないことなので、それ以外の方法で解読できると暗号化スキームが弱体化します。したがって、パスワードを書き留めて金庫に入れるなどして、最初からパスワードを紛失しないようにする必要があります。
「ユーザーのメールで暗号化されたバージョン+ユーザーがアカウントを作成するときに生成されるランダムトークンですが、これは安全でしょうか?」という質問の答えは「いいえ」であり、安全ではありません。トークン(および電子メールアドレスまたはそのハッシュ)を保存する必要があるため、パスワードをクリアテキストで保存するのと同じです。
柔軟性が必要な場合は、パスワードでデータを暗号化しないでください。ランダムに生成された暗号化キーでデータを暗号化し、このキーをパスワードで暗号化して、暗号化された形式でキーを保存します。次に、キーを他のパスワードで暗号化して、おそらく他の場所(保管庫内)に保存することもできます。結果として得られる暗号化の強度は、使用される最も弱いパスワードの1つになることに注意してください。
これは基本的に@MarkoVodopijaの回答のフォローアップです。 暗号化のためのパスワード回復の背後にある根拠は、パスワードまたはキーを安全の場所に格納することです。これは、暗号化ソフトウェアのバックドアまたは重大な欠陥のみがキーなしでデータを読み取る
safeとして受け入れるものに応じて、異なる解決策が導き出されます。マルコによって提案されたものに加えて、あなたは持っています:
ユーザーパスワードからキーを取得する場合、パスワードのリセット機能を使用する簡単な方法はありません。よく知られている実装の例とパスワードリセットの解決方法については、 this および this を参照してください。
多くの実装には、マスターキーが失われた(またはケースで忘れられた)場合に備えて、回復キー機能があります。 BitLocker はその一例です。
登録時にパスワードリセットキーを作成し、ユーザーのメールに送信することを検討してください。ただし、ユーザーのメールがハッキングされた場合、これは侵害される可能性があります。
その他のオプションは、2人以上のユーザー/管理者間で(たとえば Shamir's Secret Sharing アルゴリズムを使用して)回復キーを共有することです。そのため、リセットの場合、特定のユーザーのパスワードをリセットするために複数の当事者が必要です。 Vault でも同様のことが行われます。
よく知られているいくつかの実装だけでは、特定のベストプラクティスはないと思います。それはすべて、デザインのニーズに依存します。