web-dev-qa-db-ja.com

DB上のユーザーデータを暗号化する

私はサーバー(Java + Spring)を開発していて、それぞれに固有のキーを使用して、データベース上のユーザーの機密データを暗号化したいと考えています。

キーをベースとしてパスワードを使用してユーザーのデータを暗号化することを考えましたが...

  1. ハッシュ化された(bcrypt)パスワードのみをデータベースに保存しています
  2. ユーザーは、アカウントを作成してログインするときにのみサーバーにパスワードを送信します。リクエスト認証では、ログインごとに生成されるJWT(強力なシークレットと短い有効期限を持つユーザーIDのみを含む)を使用します。

パスワードをプレーンテキストとしてデータベースに保存することを考えましたが、同じ問題が発生しました。データベースが侵害された場合、攻撃者はユーザーのコンテンツを簡単に解読できます。

これを達成する方法はありますか?

4
alex

1つのオプションは、ログイン時にパスワードからユーザーキーを生成することです(またはランダムに生成されたキーを暗号化して保存します)。これは、ログイン中にメモリに保存され、ログアウト/セッションの期限切れ時にメモリから消去されます。

ここにはまだ問題があります-

  • セッションの有効期限が切れたときにキーをワイプするように強制するにはどうすればよいですか? -ここで発生するアクションは、通常のサーバーワークフローではありません。
  • キーがディスクにページアウトされないようにする手順を実行する必要があります。

別のオプションは、WebCrypto APIなどを使用してクライアント側で暗号化/復号化することです。

2
Hector

ユーザーのパスワードを使用して暗号化キーのロックを解除する場合は、パスワード導出キーを使用してデータ暗号化キーを復号化することをお勧めします。このように、大量のデータの実際の暗号化に使用されるキーは純粋にランダムですが、そのキー自体はパスワード派生キーで暗号化されます。

次に、パスワードを再入力してデータを復号化するか、復号化したデータキーを何らかの形式の一時ストレージ(おそらくセッション)に保存して、ユーザーがログインしている間のみ使用できるようにし、ユーザーがログインしたときにそれをダンプする必要があります。ログアウトします。

サーバーにTPMがあり、サーバーデータを使用して暗号化できる場合、セッションデータのダンプでキーが直接公開されないようにして、保存時の保護を強化できますが、これは以前のレベルを超えています。最初に説明します。

使用可能なハードウェアに応じて、使用中にキーを安全に保つことができる他の多くの方法もありますが、最終的には、Q/A形式の回答が処理できるよりも少し広い範囲です。

2
AJ Henderson