2012-03-07 5 views
10

私は長年にわたって私を悩ませています。ユーザー名とパスワードを使用してデータベースやその他のサービス(Webサービスなど)に接続する必要がある場合は、.NETアセンブリを使用して接続する場合、この情報を保存する最も安全な場所はどこですか?私はあなたがパスワードを暗号化しなければならないことを理解していますが、あなたは一種の鶏卵問題に遭遇します。それは暗号化できますが、どこに鍵を置くのですか?Windows .NETまたはASP.NETアプリケーションを使用するときにdbパスワードを保存する場所

.NETでは、.NETコードを逆コンパイルできるので、パスワードをハードコードできません。

Isolated Storageでアセンブリベースの権利を使用してみましたが、秘密のユーザーがアクセスできるため暗号化されていない秘密アイテムを格納することをお勧めします。この場合も問題はポイントAからポイントBに移動しています。データベースの情報を知る必要がないドメイン管理者は、ドメイン上のどのワークステーションでも管理者になることができるため、アクセスできるようになります。

あなたはApp.ConfigとWeb.Configを暗号化できますが、私はpriveledgesユーザーがキーにアクセスできると信じています。

私はDPAPIで同じ問題が発生すると思います。

パスワードを保存し、リモートデータベースに暗号化し、OS認証で取得することを検討しましたが、私たちの部署ではデータベースサーバーにパスワードの格納を禁止していました。私は確かに私は立ち往生して確認を求めていると確信しています。

+0

もう少し前ですが、暗号化されたパスワードを保存する方法について質問に答えました。見てください。 – Matt

答えて

9

パスワードをアセンブリに保存したくない場合は、ホイールを再作成するだけで問題が発生し、より多くの脆弱性が発生します。データベースとWebサーバーの両方でMSプラットフォームを使用している場合は、これを処理する最も簡単な方法はuse a trusted connectionで、アプリケーションが使用しているIDにSQLサーバーの権限を与えます。

次に、私はちょうどlet DPAPI do its job to encrypt your connection settingsになります。

+0

私が遭遇した主な問題は、私が働いているWebとWindowsの両方のアプリケーションが、OS認証を使用できない場所で実行されることです。特にWindowsアプリケーションは複数のユーザーボックスにあります。ユーザーモードでDPAPIを使用する場合は、ドキュメントからわかる限り、ユーザーごとに個別の設定を構成する必要があります。 DPAPIをマシンモードで使用すると、DPAPIを使用するすべてのアプリケーションで接続情報を利用できるようになります。残念ながら、FIPS 140準拠プロバイダーも使用する必要があります。これは、DPAPIとRSAのルールを定めていると思います。私はこれを行う最善の方法は、ボックスからパスワードを取得することだと思う。 –

+0

DPAPIはTripleDESを使用しました。私はそれがFIPSだと思います。これは、マシンモードでは、私が理解しているようにDPAPIを使用するすべてのアプリケーションが同じ情報にアクセスできるマルチユーザーアクセス領域ではまだ役に立ちません –

+0

ユーザーストアDPAPIを使用して設定セクションを暗号化することは可能です。指示に沿ったリンクで回答を更新しました。 IIS7 +を使用している場合は、アプリケーションプールを構成してIDのユーザープロファイルを読み込む手順については説明がないことに注意してください。 DPAPIユーザーストアではプロファイルを読み込む必要があるため、このフラグをオンにする必要があります。 – HackedByChinese

0

ここにはいくつかのオプションがあります。

  1. ストアそれら生成種で暗号化された外部ファイルに
  2. ストアそれら暗号化された設定ファイルインチこの基底シードを格納するコードを難読化するか、C++のdllに格納します(逆コンパイルは困難です)。
1

これは良い質問です。私は自分自身で答えを探しています。私が持っていた問題は、サーバーがハッキングされ、個々のファイルを取得できる場合にdbパスワードを安全に保つことでした。私が見つけた1つの非常に興味深いオプションは、web.configのセクションをWindowsのセキュアストアを使用して暗号キーを保持して取得する.NETフレームワークによって自動的に暗号化および復号化できることでした。私の状況では、私のホスティングプロバイダがそれをサポートしていなかったので利用できませんでしたが、あなたはこのオプションを見ているかもしれません。なぜ私はそれが動作するかもしれないと思うあなたは独立してWindowsのセキュリティストアにアクセスする可能性があり、潜在的な違反を大幅に制限することのセキュリティを管理することができます。サーバーに侵入したハッカーは、設定ファイルとすべてのアセンブリのコピーを取得するかもしれませんが、復号鍵にアクセスすることは彼のもう一つの障害になります。

3

あなたはあなたのデータを保護するためにの.NET Frameworkの次の方法を使用することができ、彼らはあなたのデータを保護するために内部DPAPIを使用して、あなたは直接、C#やVBでそれらを使用することができます。システムDLLの周りいじるすることなくNETコール:

namespace System.Security.Cryptography 
{ 
    // Summary: 
    //  Provides methods for protecting and unprotecting data. This class cannot 
    //  be inherited. 
    public sealed class ProtectedData 
    { 
     public static byte[] Protect(byte[] userData, 
      byte[] optionalEntropy, DataProtectionScope scope); 
     public static byte[] Unprotect(byte[] encryptedData, 
      byte[] optionalEntropy, DataProtectionScope scope); 
    } 
} 

プロジェクトに参照System.Securityを追加し、これを使用するには。保護されるデータにSALTを追加するには、バイト配列optionalEntropyを使用することを強くお勧めします(保護しようとするデータに固有のいくつかのランダムな値をバイト配列に追加します)。

scopeの場合、DataProtectionScope.CurrentUserを使用すると、データを暗号化して現在のユーザーの資格情報で保護することができます。

一部のシナリオでは、DataProtectionScope.LocalMachineも便利です。この場合、保護されたデータはマシンコンテキストに関連付けられます。この設定では、コンピュータ上で実行されているすべてのプロセスがデータ保護を解除できます。これは通常、信頼できないユーザーにアクセスが許可されていないサーバーで実行されるサーバー固有のアプリケーションで使用されます。

Protectメソッドを使用してデータを暗号化し、Unprotectで復号化します。アプリケーションの要件(ファイル、データベース、レジストリなど)に従って返されたバイト配列を格納することができます。これらの方法について

詳細は、MSDNでここで見つけることができる:

コードサンプルの場合あなたはこれをチェックアウトする、の.configファイルのアプリケーションの一部を暗号化することに興味がある:

私はあなたが使用することをお勧めしますSALT(すなわち、 optionalEntropyパラメータを使用して) - これはレインボーテーブル攻撃から保護します。


私が言及したいDPAPIソリューションの一つの欠点があります:キーはWindowsの資格情報に基づいて生成され、Windowsの資格情報へのアクセス権を持っている人は誰でも意味は、おそらく保護されたデータへのアクセスをしています。あなたのアカウントの下で動作しているプログラムも保護されたデータにアクセスできます。

関連する問題