私はサーバー(Java + Spring)を開発していて、それぞれに固有のキーを使用して、データベース上のユーザーの機密データを暗号化したいと考えています。
キーをベースとしてパスワードを使用してユーザーのデータを暗号化することを考えましたが...
パスワードをプレーンテキストとしてデータベースに保存することを考えましたが、同じ問題が発生しました。データベースが侵害された場合、攻撃者はユーザーのコンテンツを簡単に解読できます。
これを達成する方法はありますか?
1つのオプションは、ログイン時にパスワードからユーザーキーを生成することです(またはランダムに生成されたキーを暗号化して保存します)。これは、ログイン中にメモリに保存され、ログアウト/セッションの期限切れ時にメモリから消去されます。
ここにはまだ問題があります-
別のオプションは、WebCrypto APIなどを使用してクライアント側で暗号化/復号化することです。
ユーザーのパスワードを使用して暗号化キーのロックを解除する場合は、パスワード導出キーを使用してデータ暗号化キーを復号化することをお勧めします。このように、大量のデータの実際の暗号化に使用されるキーは純粋にランダムですが、そのキー自体はパスワード派生キーで暗号化されます。
次に、パスワードを再入力してデータを復号化するか、復号化したデータキーを何らかの形式の一時ストレージ(おそらくセッション)に保存して、ユーザーがログインしている間のみ使用できるようにし、ユーザーがログインしたときにそれをダンプする必要があります。ログアウトします。
サーバーにTPMがあり、サーバーデータを使用して暗号化できる場合、セッションデータのダンプでキーが直接公開されないようにして、保存時の保護を強化できますが、これは以前のレベルを超えています。最初に説明します。
使用可能なハードウェアに応じて、使用中にキーを安全に保つことができる他の多くの方法もありますが、最終的には、Q/A形式の回答が処理できるよりも少し広い範囲です。