12

私には、何年もの間私を悩ませてきたシナリオがあります。ユーザー名とパスワードを使用してデータベースまたはその他のサービス (Web サービスなど) に接続する必要がある場合、.NET アセンブリを介して接続している場合、この情報を保存する最も安全な場所はどこでしょうか? パスワードを暗号化する必要があることは理解していますが、暗号化することはできますが、鍵はどこに置くのでしょうか?

.NET では、.NET コードを逆コンパイルできるため、パスワードをハードコードすることはできません。

分離ストレージでアセンブリ ベースの権限を使用することを検討しましたが、特権ユーザーがアクセスできるため、暗号化されていない秘密のアイテムをそこに保存しないことを MS は推奨しています。そのため、問題をポイント A からポイント B に移しています。たとえば、ドメイン管理者ドメイン上の任意のワークステーションの管理者になることができるため、データベース内の情報を知る必要なくアクセスできます。

アプリを暗号化できます。Config と Web.Config ですが、特権ユーザーはキーにアクセスできると思います。

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

パスワードをリモート データベースに暗号化して保存し、OS 認証を介して取得することも検討しましたが、部門はパスワードをデータベース サーバーに保存することを禁止しています。私は立ち往生していて、確認が必要だと確信しています。

4

5 に答える 5

11

パスワードをアセンブリに保存する必要はありません。車輪の再発明を行うと、その価値よりも多くの問題が発生します(そしてより多くの脆弱性が発生します)。データベースとWebサーバーの両方でMSプラットフォームを使用している場合、これを処理する最も簡単な方法は、信頼できる接続を使用し、アプリケーションが使用しているIDにSQLサーバーの権限を付与することです。

次に、接続設定を暗号化するためにDPAPIに任せます

于 2012-03-07T22:08:35.890 に答える
4

.NET Frameworkの次のメソッドを使用して、データを保護できます。それらはデータを保護するために内部でDPAPIを使用し、システムDLL呼び出しをいじくり回すことなく、C#またはVB.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します。バイト配列を使用して、保護されたデータにSALToptionalEntropyを追加することを強くお勧めします(保護するデータに固有のランダムな値をバイト配列に追加します)。

scopeを使用できます。DataProtectionScope.CurrentUserこれにより、データが暗号化され、現在のユーザーの資格情報で保護されます。

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

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

これらのメソッドの詳細については、MSDNを参照してください。

コードサンプルについて、およびアプリケーションの.configファイルの一部を暗号化することに関心がある場合は、次を確認してください。

SALTを使用することをお勧めします(optionalEntropyパラメーターを使用して)-レインボーテーブル攻撃から保護します。


私が言及したいDPAPIソリューションの1つの欠点があります。キーは、Windowsクレデンシャルに基づいて生成されます。つまり、Windowsクレデンシャルにアクセスできる人は誰でも、保護されたデータにアクセスできる可能性があります。アカウントで実行されているプログラムは、保護されたデータにもアクセスできます。

于 2013-03-11T15:19:39.960 に答える
1

これは良い質問です。私は自分で答えを探していました。私が抱えていた問題は、サーバーがハッキングされて個々のファイルを取得できる場合に備えて、db パスワードを安全に保つことでした。私が見つけた非常に興味深いオプションの 1 つは、Windows セキュア ストアを使用して暗号化キーを保持および取得する .NET フレームワークによって、web.config のセクションをオンザフライで自動的に暗号化および復号化できることです。私の状況では、ホスティング プロバイダーがサポートしていなかったために利用できませんでしたが、このオプションを参照してください。私がそれが機能すると考える理由は、ユーザーが Windows セキュア ストアにアクセスする可能性のあるセキュリティを個別に管理し、潜在的な侵害を大幅に制限できるからです。

于 2012-03-08T22:02:53.883 に答える
0

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

  1. それらを暗号化された設定ファイルに保存します
  2. 生成されたシードで暗号化された外部ファイルにそれらを保存します。このベースシードを格納するコードを難読化するか、c ++ dllに格納します(逆コンパイルが困難)。
于 2012-03-08T02:47:21.300 に答える