対称暗号化アルゴリズムを使用するWebアプリケーションがあります。
秘密鍵と初期化ベクトルをどのように保存しますか?コードにリテラルとして保存するのは悪い考えのようです。アプリの設定はどうですか?ここでのベストプラクティスは何ですか?
Webappの世界での標準的なアプローチの1つは、キーを分割して異なる場所に配置することです。たとえば、キーを分割し、その一部をファイルシステム(「webapps」ディレクトリの外部)に、その一部をJNDI構成(または.netに相当)に、およびその一部をデータベースに配置できます。バックアップメディアやSQLインジェクションを調べるなど、侵害された場合、単一のピースを取得することは特に難しくありませんが、すべてのピースを取得するには、さらに多くの作業が必要になります。
同じサイズの乱数とXORを実行することにより、キーを分割できます。 (暗号的に強力な乱数ジェネレーターを使用してください!)キーを複数の部分に分割する場合、このプロセスを数回繰り返すことができます。必要なプロセスの最後に、たとえば、p1 ^ p2 ^ p3 = keyとなる3つの部分キー。部分キーの一部をbase64でエンコードして、JNDIプロパティなどに適切に保存できるようにする必要がある場合があります。
(キーを分割するより洗練された方法があります。たとえば、n-of-mアルゴリズムでは、キーを再作成するためにすべてのピースを必要としないが、それはここで必要なものをはるかに超えています。)
ユーザーに積極的にパスワードを入力するように要求できる場合、パスワードを適切な対称キーに変換するPBE(パスワードベースの暗号化)アルゴリズムがあります。外部ファイルも必要なものを見つけたいと思います。繰り返しになりますが、テープのバックアップまたはパスワード自体では十分ではない場合、両方が必要です。これを使用して、JNDIでパスワードを2つに分割することもできます。JNDIでプレーンテキストパスフレーズを使用し、ファイルシステムのどこかに初期化ファイルを使用できます。
最後に、アプリケーションの「キーの再生成」がかなり簡単にできることを確認します。 1つの方法は、上記で取得したパスワードを使用して、実際の暗号化キーを含む別のファイルを復号化することです。これにより、すべてのデータの大規模な再暗号化を必要とせず、実際のキーを再暗号化することなく、パスワードが危険にさらされていると思われる場合、パスワードを簡単に変更できます。
アプリケーションが起動するたびにパスワードをインタラクティブに入力することは可能ですか?この方法では、キーを保存する必要はありません。または、少なくとも「キー」(対称キーまたは秘密キー)は、この「ブートストラップ」パスワードで暗号化できます。
そうでない場合は、ファイルに秘密鍵を単独で保存し、その許可を変更して、Webアプリケーションを実行しているユーザーのみがアクセスできるようにします。
これらのアプローチはプラットフォームに依存しません。より具体的な提案については、プラットフォームに関する情報が役立ちます。
ところで、初期化ベクトルは1つのメッセージのみに使用する必要があります。また、IVは秘密にされていないため、どこにでも保存できますが、IVを使用する1つのメッセージと共に保存するのが慣例です。
アプリケーションの起動時に対称キーを必要とし、特定のファイルでそれを検索するアプローチを使用しました。アプリケーションが起動したら、ファイルを削除します。ファイルのコピーは、必要な再起動のためにリモートで保持されます。アプリケーションが頻繁に再起動する場合、明らかにこのアプローチは実行できません。
別の代替手段は、Windows証明書ストアなどの証明書マネージャーです。証明書とそのキーを安全に保存できます。また、秘密キーをエクスポート不可としてマークすることも可能であるため、キーを取得するには深刻なハッキングが必要になります。アプリケーションは証明書ストアから証明書をロードし、オペレーションを呼び出して要求に署名したり、新しい対称キーを生成したりできます。さらに、特定の特権アカウントのみが証明書にアクセスできるように、異なる証明書ストアにアクセス許可を割り当てることができます。
web.configに貼り付けて そのセクションを暗号化
これSO質問 web.config暗号化について詳しく説明します
これは役立つはずです...
http://msdn.Microsoft.com/en-us/library/ms998280.aspx
ただし、データの保護を真剣に考えている場合は、PKIへの移行を検討する必要があります。