web-dev-qa-db-ja.com

新しい暗号化方式への切り替え(データを失うことなく?)

ある種のサービスを提供するウェブサイトがあるとしましょう。ユーザーはログインでき、ある種のデータを保存でき、すべてを安全に保つためにさまざまな種類の暗号化が実施されています。パスワードはソルト化およびハッシュ化され、ユーザーデータは暗号化され、キーは安全に保管され、すべて問題ありません。

ある日、悪者はあなたが使用している暗号化アルゴリズムに脆弱性を見つけます。脆弱性とは何か、またはそれがどのアルゴリズムであるかなどの詳細は関係ありません。重要なのは、データの一部またはすべてが以前ほど安全ではなくなったことです。実際には、保存した暗号化データからユーザーデータを取り戻すことが可能になりました。

この状況にどのように対処しますか?

パスワードの場合は、全員のパスワードを無効にし、リセット通知を発行して、それらのパスワードを送信したばかりの電子メールアカウントが同様に脆弱ではないことを期待できます...これは良い考えですか?

他のデータについては...まあ、それは可逆暗号化を使用して保存されているので、新しい非破壊方法を使用して復号化と再暗号化を実行できると思いますが、そのためにはおそらく(うまくいけば)キーが必要です)一方向の暗号化を使用してパスワードのように保存されるため、行き詰まります。明らかに、最も安全な行動はデータをスクラブすることですが、それはかなり劇的に思えます。ユーザーは、非常に小さく、決して実現しない可能性のある仮想的なリスクに直面して、すべてのデータを失うことに多少不安を感じるでしょう。

私が持っていた考えの1つは、暗号化されたデータを取得して、別の(壊れていないアルゴリズム)で再度暗号化できるため、新しい脆弱性を使用してデータを回復できず、次回ユーザーがログインして、古い方法に続いて新しい方法を使用し、それが機能する場合は、フィールドをワイプして、新しい方法を使用するだけの新しいバージョンを保存します。塩漬けのハッシュを使用すると、新旧の塩も保存する必要がありますが、それは大したことではありません。したがって、テーブルには、そのユーザーがまだ新しいシステムに移行されているかどうかを通知するフラグ用の追加の列が必要になります。ソルトハッシュの場合は、追加のソルト用の別の列が必要になります。これは機能しますか、それとも私が見つけていない脆弱性がありますか? 2つの暗号化方法を組み合わせると、単独で使用した場合にどちらの方法にも存在しない脆弱性が生じる可能性があることを認識していますが、現在のデータが安全でないことがわかっている方法を使用して暗号化されている場合、私の理論ではまた、それを平文として扱います。その時点で暗号化を追加すると、安全性が増すだけです。

4
anaximander

これを行う最良の方法は、ユーザーがログインしたときに暗号を移行するか、数か月経ってもパスワードとデータが無効にならない場合は無効にすることです。

したがって、パスワードの場合、ユーザーがログインすると、プレーンテキストのパスワードがわかっているので、新しいハッシュを計算するだけです。オプションで、ユーザーに新しいパスワードの選択を強制します。暗号化されたデータの場合、ユーザーはログインし、パスワードが再びわかるので、再暗号化するだけです。

再暗号化の問題は、使用する新しい暗号のパスワードを知る必要があることです。また、基礎となる暗号がタイミングまたは電力分析攻撃に対して弱い状況になる傾向があります。

再ハッシュの問題は、最初のハッシュスキームの衝突の脆弱性が新しいスキームに永続化されることです。

したがって、どちらの場合も、ユーザーがログインするのを待ってから、それらを移行することをお勧めします。

別の方法は、一時的な手段としてダブルハッシュまたはダブル暗号化してから、ログイン時に移行することです。それはより多くの開発作業ですが、少し安全に動作します。

4
Polynomial