web-dev-qa-db-ja.com

web.configに保存されているパスワードを保護するにはどうすればよいですか?

Web.configファイル内に次の設定を追加して、外部システムへのAPI呼び出しを開始しました。だから私は次のようにAPI URL +ユーザー名+パスワードを保存しています:

<appSettings>
    <add key="ApiURL" value="https://...../servlets/AssetServlet" />
    <add key="ApiUserName" value="tmsservice" />
    <add key="ApiPassword" value="test2test2" /> 

次に、アクションメソッド内で、次のようにWebクライアントを構築するときにこれらの値を参照します。

public ActionResult Create(RackJoin rj, FormCollection formValues)
        {
           XmlDocument doc = new XmlDocument();
           using (var client = new WebClient())
                {
                    var query = HttpUtility.ParseQueryString(string.Empty);
                    foreach (string key in formValues)
                    {
                        query[key] = this.Request.Form[key];
                    }

                    query["username"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiUserName"];
                    query["password"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiPassword"];

                    string apiurl = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiURL"];

しかし、これでユーザー名とパスワードを公開し、ユーザーがこれらをキャプチャできるので、私の質問はAPIユーザー名とパスワードをどのように保護することができますか?

28
john Gu

一般に、web.configは安全なファイルであり、IISはサービスを提供しません。したがって、Webサーバーへのリクエストを行っているユーザーには公開されません。Webサーバーは特定の種類のファイルとweb.configは確かにそれらの1つではありません。

多くの場合、パスワードを含むデータベース接続文字列を保存します。次に、web.configが安全でないシナリオを想像してください。アプリケーションに対する重大なセキュリティ上の脅威を作成しました。

したがって、特にプロジェクトが大きすぎない限り、心配する必要はありません。

しかし、より良いアプローチがありますが、「リソース」と呼ばれるプロジェクトを作成し、設定、const、enumなどのすべての重要な情報をそこに保存します。それは洗練された組織的なアプローチでしょう。

ただし、セキュリティで保護されたAPI呼び出しの場合など、ユーザー名/パスワードをネットワーク経由で渡す場合は、httpsを使用して、移動中の情報が暗号化されていることを確認できますが、これはセキュリティとは関係ありませんweb.configファイル。

13
JC Lizard

aspnet_regiisでweb.configを暗号化 できます。これは、サーバーにアクセスできる人が機密情報を読み取れないようにするためです。

ところで、構成設定をクラス内に配置し、それをコントローラーにインジェクトでき​​ます-単体テストが簡単になります。

24
Joe Ratzer

Web.configファイルはファイルシステム上の単なるファイルであるため、他のファイルと同様に(ほとんど)セキュリティを考慮する必要があります。 IIS(IIS- )

通常のWindowsファイルを使用して、Webサイトアプリドメインユーザー(および必要に応じて展開ユーザー)を読み取るフォルダー権限を使用して、Webサイトディレクトリ(c:/ sites/my-site-hereまたは何でも)を保護することをお勧めします許可

そのため、Webサーバーのセキュリティに自信がある場合は、暗号化する必要はありません。ただし、共有ホスティング、Webサイトコードの販売、またはソースコードが公開されている場合は、暗号化するのが賢明かもしれません。しかし、少し面倒です。

3
alastairtree

Web.configを使用する理由

データを定数、列挙などに格納するのではなく、Web.configに格納する利点の1つは、異なる環境のデータを簡単に変更できることです。

データの保護

Web.configのデータを保護する最善の方法は、データを暗号化することです。 Joe および ser1089766 で提案されているように、構成ファイルのセクション全体を暗号化する代わりに、パスワード文字列を暗号化して構成に保存することができます。

データの取得

以下のようなヘルパー関数を使用して、キーを復号化できます。

private const readonly string decryptKey = "";
public string GetFromConfig(string key)
{
   var encryptedText = System.Web.Configuration.WebConfigurationManager.AppSettings[key];
   var plainText = Decrypt(encryptedText, decryptKey);
   return plainText;
}

この方法で、復号化キーはすべての環境に共通のプロジェクト内にあります。ただし、アプリを再コンパイルしなくてもweb.configのデータを簡単に変更できます。

[〜#〜] ps [〜#〜]:各バージョンで復号化キーと対応するデータを変更して、セキュリティを向上させることができます。

2
Kolappan Nathan