web-dev-qa-db-ja.com

暗号化されたキーをデータベースに保存することは安全ですか(他の暗号で暗号化されていますか)?

アプリケーションで使用される暗号化フローを改善したい。今日、私はAES暗号を使用していますが、その鍵とそのIvBufferはコードにハードコーディングされています。私はそれが安全でないことを知っています、そして私はこれを改善したいと思います。鍵がデータベースに保管されている間に、新しいAES暗号を作成したいと考えています。鍵は古いAES暗号で暗号化されます。

アプリケーションは新しいAES暗号を使用します。

  • 古い暗号を使用して、新しい暗号の鍵を復号化します。
  • 復号化されたキーを使用して、新しい暗号を使用して情報を暗号化/復号化します。

このフローにより、将来的にキーのローテーションが容易になります(詳しく説明できますが、私の質問とは関係ありません)。

暗号化プロセスはどのように保護されますか?

新しいAES暗号のIvBufferをどうするか?それをデータベースに保存するか、コードにハードコーディングするか?

追加

以下の回答から、ハードコードされたキーを追加してもセキュリティが向上しないことを理解しています。暗号化キーをデータベースに保存する必要があります(ここにリストされているオプション7 暗号化用のキーを保存する場所 )。残念ながら、キーストレージに外部デバイスを使用できないため、データベースを使用する必要があります。

キーがデータベースのプレーンテキストに格納されている場合のオプションのセキュリティが、データベースに格納されている同じキーに追加のハードコーディングされたキーが使用されている場合のオプションよりも優れているかどうかを質問します。

1
Michael

私があなたを正しく理解している場合は、ハードコーディングされたままの古いキーを引き続き使用しますが、それを使用してAESキーを暗号化し、AESキーを使用してデータの暗号化と復号化に使用します。

これはセキュリティを向上させません。古い設計の脆弱性は、キーとIVがハードコードされていることです。新しいキーを古いキーで暗号化すると、さらに複雑なレイヤーが追加されます(複数のキーを処理する必要があるため)。言うように、キーローテーションを行う場合は、古い暗号で暗号化に使用していたデータを再暗号化した後、古いキーを新しいキーに置き換える必要があります。

IVに関する限り:暗号化の観点から見ると、IVが暗号化されたテキストごとに一意である限り、これらは公開されます。たとえば、CBCモードでは、IVはプレーンテキストにXORする最初の入力にすぎません。後続のすべてのブロックでは、前のブロックの暗号化テキストがそのために使用されます。重要なこと鮮度です。

ハードコーディングの代替

少なくともキーを後で変更する機能があるため、データベースにキーを保存する方が適切です。データベースを適切に保護する場合(つまり、パスワード保護と暗号化)、それはかなり安全なソリューションになる可能性があります。ただし、パスフレーズで保護されたファイルにキーを保存する既存のライブラリを使用する方が簡単です。つまり、データにアクセスするためのロジックは次の要素で構成されます。

  • パスフレーズを取得する
  • パスフレーズを使用してファイルからキーを抽出します
  • メモリからパスフレーズを破棄する
  • キーを使用してデータを復号化し、新しいデータを暗号化して書き込む
  • メモリからキーを破棄する

ライブラリを使用すれば、パスフレーズをすべて実行できる可能性があります。そのトピックについてさらに質問がある場合は、2番目の質問を開くことをお勧めします。