6

ASP.Net Web サーバーの構成ファイル設定を暗号化するアプリケーションに取り組んでいます。私が実装している暗号化方法は、AES と RSA を使用してデータをエンベロープすることです。AES キーを生成し、その AES キーを使用してデータを暗号化し、Windows 証明書ストアの証明書の公開キーで AES キーを暗号化しています。次に、データを、暗号化された AES キーと、暗号化に使用された証明書のシリアル番号と共に、構成ファイルに保存します。

このデータにアクセスしたいときは、AES キーを暗号化するために使用された証明書のシリアル番号を読み取り、その証明書から秘密キーを引き出し、AES キーを復号化し、そのキーを使用してデータを復号化します。ここで、セキュリティのレベルが不明です。

証明書に関連付けられた秘密鍵にアクセスするには、秘密鍵をエクスポート可能としてマークし、アプリケーションが秘密鍵にアクセスして実行できるようにする必要があります。これは ASP.Net サーバーであるため、そのユーザーは "Network Services" です。これがセキュリティ上の問題になる理由がわかると思います。基本的に、誰かが Web 経由で私の ASP.Net サーバーに侵入した場合、おそらく何らかのインジェクションによって、その秘密キーにアクセスできるのではないでしょうか?

モデルをより安全にする方法について何か提案はありますか?

復号化機能:

//need an rsa crytpo provider to decrypt the aes key with the private key associated with the certificate
using (RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider) decryptionCertificate.PrivateKey)
{
    //decrypt the aes key with the cert's private key
    byte[] aesKey = rsaCSP.Decrypt(encryptedAESKey, false);

    //decrypt data using the decrypted aes key and the IV passed in
    decryptedData = decryptWithAes(encryptedData, aesKey, aesIV);
}

ありがとう。

4

4 に答える 4

2

Just by writing

RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider)decryptionCertificate.PrivateKey

it doesn't mean that you are assigning the actual "key". You can make the private key Non-Exportable and still would be able to perform decryption.

于 2011-06-04T11:51:40.787 に答える
1

秘密鍵を使用した証明書がある場合は、AES鍵のPKCS#7/CMS暗号化を採用するのが理にかなっています。これにより、エクスポートできない秘密鍵を使用してデータを復号化できます。

残念ながら、.NETはCMS暗号化のクラスを提供していないようです。CryptoAPIはそのような関数(CryptEncryptMessageおよびCryptDecryptMessage)を提供しますが、P / Invokeを介して呼び出す必要があり、これはある程度重要な場合があります。これを行うC#サンプルについては、こちらのソースコードを参照してください

別のオプションは、SecureBlackboxコンポーネント(TElMessageEncryptor、TElMessageDecryptor)を使用することですが、あなたの場合、これはやり過ぎかもしれません。

于 2011-05-07T06:38:35.970 に答える
1

あなたのセキュリティ モデルには固有の矛盾があると思います。ユーザー「Network Services」の下で実行されているアプリケーションが構成ファイルを復号化できるようにしたいが、「Network Services」ユーザーが危険にさらされた場合でも、暗号化された情報を安全にしたい。この 2 つの目標は、ユーザーがデータにアクセスできるかできないかという相反するものです。できる最善のことは、セキュリティ アクセスを分離することだと思います。そうすれば、1 台のマシンの「ネットワーク サービス」が侵害された場合でも、他のユーザーや他のマシンのセキュリティが侵害されることはありません。これが、Windows セキュリティ モデルが各マシンの各ユーザーに独自の秘密キーを提供する理由です。これは、構成ファイルを暗号化/復号化するために DPAPI によって使用されるキーです。

モデルでは、標準のキーセットで構成情報を暗号化していると言います。このモデルでは、1 台のマシン上の 1 人の信頼できるユーザーが侵害された場合、攻撃者はすべてのマシン上のすべてのユーザーのすべての暗号化された構成データにアクセスするためのキーを取得します。マシンの故障に備えてマネージド キーを使用しているとのことですが、暗号化されているデータをバックアップして管理する方が、そのデータへのアクセスに使用されているキーをバックアップして管理するよりも安全であることをお勧めします。

私の提案は、ローカル マシン上のユーザーの Windows 秘密キーを使用する、構成データを暗号化/復号化する組み込みの .Net メソッドを使用することです。(ここに標準的なアプローチを実装するいくつかの例があります: http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspxとここ: http://www.codeproject.com/KB/security/ProtectedConfigWinApps.aspx ) 重要で、マシンの障害が発生した場合に回復する必要があるデータが構成ファイルに入れられている場合は、そのデータをあなたのデータベースまたはその他の中央データ ストアをバックアップとして保存します。これにより、すべてのデプロイで同じマネージド キーを使用する必要がなくなります。

于 2011-07-14T14:53:08.733 に答える