インターネットからアクセスされるDjangoを使用して、データベースバックエンドを備えたWebアプリケーションを開発しています。データベースには機密情報が含まれるため、使用するアプローチについていくつかアドバイスをお願いしますデータを保護します。
アプローチ1:インターネットに面したサーバー上の公開鍵を使用して、RSA-2048ビット暗号化を使用して情報を暗号化します。次に、インターネットに面していない別のサーバーに、秘密鍵を使用してデータを復号化する別のWebアプリケーションを用意します。
アプローチ2:AES-256ビット暗号化を使用して、インターネットに面したサーバー上で単一の暗号化/復号化キーを使用して情報を暗号化します。
どのアプローチがより安全で効率的ですか?
アプローチ1で私が目にする問題は、ベルトとブレースのアプローチではありますが、Webアプリケーションを介して送信されるデータは、暗号化された後はエンドユーザーが変更できないことです。また、アプローチ2で見られる問題は、暗号化/復号化キーが単一のサーバー上にあるため、Webアプリケーションが侵害された場合にデータも侵害されるということです。
助言をいただければ幸いです。
前もって感謝します。
効率について:同等のセキュリティレベルの対称暗号化(AESなど)は、非対称暗号化(RSAなど)よりも常に高速です。
このため(また、RSAはセキュリティを確保するためにランダムなパディングを必要とするため、暗号文はプレーンテキストよりも少し大きいため)、RSAを使用する通常の方法(キーサイズ以上のものを暗号化する必要がある場合)は、対称アルゴリズムのランダムキー。RSAでそのキーを暗号化し、このランダムキーでプレーンテキストを暗号化し、暗号化されたキーをプレーンテキストとともに保存します。
したがって、選択範囲は実際には次のとおりです。
ここでの実際の暗号化は、攻撃者が有利になる点ではありません。AESとRSAの両方(指定されたキーサイズ)は、ブルートフォース攻撃に対抗するのに十分安全です。
対称暗号化のみを使用している場合、もちろん暗号化サーバーはこのキーを必要とし、侵害された場合、このキーを使用してデータベース内のデータを復号化できます。これを回避する方法は本当にありません。
非対称暗号化を使用している場合、暗号化サーバーは公開鍵のみを持つことができますが、これは、このwebappサーバーがデータを再度復号化する必要がない場合(つまり、書き込み専用データの場合)にのみ実行可能なオプションです。あなたは本当にそのようなデータを持っていますか? (送信後に変更できますが、上書きするだけで、最初に読んだり、変更したり、書き戻したりすることはできません。)
また、これは暗号化にpublicキーを使用しているため、データベースアクセスを持つ攻撃者がデータを他の何かに変更することを妨げるものはありません。攻撃者が何らかの理由でデータベースにアクセスした場合(もちろん、そうすべきではありません)、暗号化されたデータから公開鍵を取得することはそれほど複雑ではありません。これにより、攻撃者はデータベースに新しいレコードを挿入するか、古いレコードを上書きするだけで、復号化プロセス(秘密キーを使用)で違いを確認できません。これを回避するには、書き込みプロセスでデータに署名し(別のキーペアの秘密キーを使用)、読み取りプロセスでこれらの署名を確認します。
最初のサーバーをオンデマンドで復号化するために2番目のサーバーを使用できますが、これは最初のサーバーがそれ自体を実行するよりもはるかに安全ではありません(攻撃者の存在を指摘するときに、サーバーを遮断するだけです)。
したがって、セキュリティを完全に見積もるには、最初に攻撃モデル(つまり、どの攻撃に対して確認したいか)を用意する必要があります。次に、どのバリアントがより適切に保護するかを判断できます。
インターネットに接続しているサーバーが攻撃されないようにしたいのですが。
データベース自体の暗号化は、どちらの方法でも、Webサーバー上の攻撃ルートを開きません(または閉じません)。それらは異なるだけです攻撃者がWebアプリケーションに別のセキュリティホールを見つけてWebサーバーにアクセスする場合。