次の方法で共有


セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 ASP.NET から DPAPI (コンピュータ ストア) を使用する方法

patterns and practices home

J.D. Meier, Alex Mackman, Michael Dunner, and Srinath Vasireddy
Microsoft Corporation

November 2002
日本語版最終更新日 2003 年 3 月 17 日

適用対象:
    Microsoft® ASP.NET
    Microsoft Visual Studio® .NET
    Microsoft Windows® 2000

全体の概要については、「セキュリティ保護された ASP.NET アプリケーションの構築」の開始ページを参照してください。

要約 : ここでは、ASP.NET の Web アプリケーションまたは Web サービスから DPAPI を使用して機密データを暗号化する方法について説明します。

目次

メモ
必要条件
要約
参考資料

Web アプリケーションでは、データベースの接続文字列やサービス アカウントの資格情報など、機密扱いのデータをアプリケーション構成ファイルに記述しなければならないことがあります。セキュリティ上の観点から、この種のデータはプレーン テキストで格納せずに、暗号化した状態で格納する必要があります。

ここでは、ASP.NET から DPAPI を使用する方法について説明します。ASP.NET の Web アプリケーション、Web サービス、および ASP.NET でホストされる .NET リモート処理コンポーネントがこれに含まれます。

ここで紹介するコードは、マネージ クラス ライブラリを通じて DPAPI を参照します。このマネージ クラス ライブラリの作成方法の詳細については、このガイドの「パート IV : 参照」の「DPAPI ライブラリを作成する方法」を参照してください。

メモ

  • DPAPI は、コンピュータ ストアまたはユーザー ストアで使用できます。ユーザー ストアの場合は、ユーザー プロファイルが読み込まれている必要があります。既定では、ユーザー ストアが使用されます。コンピュータ ストアを使用するには、DPAPI 関数に CRYPTPROTECT_LOCAL_MACHINE フラグを渡します。

  • ユーザー ストアの場合は、機密データにアクセスできるユーザーを制限できるため、セキュリティ的にはより強固であるといえます。データを暗号化したユーザーのみがそのデータを解読できます。ただし、ASP.NET Web アプリケーションからユーザー ストア ベースで DPAPI を使用する場合は、ユーザー プロファイルの読み込みとその解除を実行するコードを別途作成する必要があります。ASP.NET には、自動的にユーザー プロファイルを読み込むしくみがないためです。

  • ここで説明するコンピュータ ストアの場合は、ユーザー プロファイルの読み込みの管理が必要ないため、開発が比較的容易です。ただし、コンピュータのすべてのユーザーがデータを解読できるため、エントロピ パラメータを追加しない限り、セキュリティは脆弱になります。エントロピとは、機密データの解読を困難にするために設計されたランダム値です。エントロピ パラメータを追加する場合、エントロピ パラメータもセキュリティ保護された状態で格納する必要が生じ、キー管理の問題がもう 1 つ増える形になります。

    メモ DPAPI をコンピュータ ストアで使用した場合は、暗号化した文字列がそのコンピュータ固有のものになります。したがって、それぞれのコンピュータでデータを暗号化する必要があります。あるコンピュータで暗号化したデータを、ファームまたはクラスタ内の別のコンピュータにコピーして使用することはできません。

  • ASP.NET Web アプリケーションからユーザー ストアで DPAPI を使用する方法については、このガイドの「パート IV : 参照」の「ASP.NET と Enterprise Services から DPAPI (ユーザー ストア) を使用する方法」を参照してください。ここでは、サービス コンポーネントと Enterprise Services アプリケーションを使用してユーザー ストアを使用しています。

必要条件

ハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、スキル、知識、サービス パックの要件は、以下のとおりです。

  • Microsoft Windows 2000 オペレーティング システム
  • Microsoft Visual Studio .NET 開発システム

また、Microsoft Visual C#® 開発ツールを使用した ASP.NET Web アプリケーションの構築に関する知識も必要です。

ここで説明する手順を始める前に、「DPAPI ライブラリを作成する方法」の説明に従い、必要な DPAPI マネージ クラス ライブラリを作成してください。

要約

ここでは、次の手順について説明します。

  1. ASP.NET クライアント Web アプリケーションを作成する。
  2. アプリケーションをテストする。
  3. 暗号化された接続文字列を Web.Config から読み取ることができるように Web アプリケーションを修正する。

1. ASP.NET クライアント Web アプリケーションを作成する

ここでは、Web.config ファイルに格納されているデータの暗号化と解読を行うために DPAPI クラス ライブラリを呼び出す ASP.NET クライアント Web アプリケーションを作成します。

■ ASP.NET クライアント Web アプリケーションを作成するには

  1. Visual Studio .NET を起動し、"DPAPIClientWeb" という名前の新しい C# ASP.NET Web アプリケーションを作成します。

  2. DPAPI ライブラリを作成する方法」で作成した DataProtector.dll アセンブリへの参照を追加します。

  3. WebForm1.aspx.cs ファイルを開き、ファイルの先頭の既存の using ステートメントの下に次の using ステートメントを追加します。

using System.Text;
using DataProtection;

  1. 表 1 のコントロールを WebForm1.aspx に追加します。

    表 1 WebForm1.aspx に配置するコントロール

    コントロールの種類 テキスト ID
    Button 暗号化 btnEncrypt
    Button 解読 btnDecrypt
    TextBox   txtDataToEncrypt
    TextBox   txtEncryptedData
    TextBox   txtDecryptedData
    Label   lblError
    Label 暗号化するデータ
    Label 暗号化後のデータ
    Label 解読後のデータ

    Web フォームは図 1 のようになります。

    図 1 DPAPIClientWeb Web フォーム

  2. [暗号化] ボタンをダブルクリックして、ボタン クリック イベント ハンドラを作成します。

DataProtector dp = new DataProtector( DataProtector.Store.USE_MACHINE_STORE );
try
{
  byte[] dataToEncrypt = Encoding.ASCII.GetBytes(txtDataToEncrypt.Text);
  // Not passing optional entropy in this example
  // Could pass random value (stored by the application) for added security
  // when using DPAPI with the machine store.
  txtEncryptedData.Text =
                Convert.ToBase64String(dp.Encrypt(dataToEncrypt,null));
}
catch(Exception ex)
{
  lblError.ForeColor = Color.Red;
  lblError.Text = "Exception.<br>" + ex.Message;
  return;
}
lblError.Text = "";

  1. Web フォームに戻って、[解読] ボタンをダブルクリックします。ボタン クリック イベント ハンドラに次のコードを追加します。
DataProtector dp = new DataProtector(DataProtector.Store.USE_MACHINE_STORE);
try
{
  byte[] dataToDecrypt = Convert.FromBase64String(txtEncryptedData.Text);
  // Optional entropy parameter is null. 
  // If entropy was used within the Encrypt method, the same entropy parameter
  // must be supplied here
  txtDecryptedData.Text = 
                     Encoding.ASCII.GetString(dp.Decrypt(dataToDecrypt,null));
}
catch(Exception ex)
{
  lblError.ForeColor = Color.Red;
  lblError.Text = "Exception.<br>" + ex.Message;
  return;
}
lblError.Text = "";

  1. [ビルド] メニューの [ソリューションのビルド] をクリックします。

2. アプリケーションをテストする

ここでは、Web アプリケーションをテストして、データの暗号化と解読が正常に行われるかどうかを確認します。

■ アプリケーションをテストするには

  1. Ctrl キーを押しながら F5 キーを押して、Web アプリケーションを実行します。

  2. [暗号化するデータ] ボックスに文字列を入力し、[暗号化] をクリックします。 Base64 エンコード形式で暗号化されたデータが [暗号化後のデータ] ボックスに表示されていることを確認します。

  3. [解読] ボタンをクリックします。

    暗号化されていたデータが正常に解読され、[解読後のデータ] ボックスに表示されることを確認します。

3. 暗号化された接続文字列を Web.Config から読み取ることができるように Web アプリケーションを修正する

ここでは、暗号化されたデータベース接続文字列をアプリケーションの Web.config ファイルの <appSettings> 要素に記述します。次に、Web.config ファイルから暗号化された文字列を読み取り、解読するコードを追加します。

■ 暗号化された接続文字列を Web.Config から読み取ることができるように Web アプリケーションを修正するには

  1. Visual Studio .NET に戻り、デザイナ モードで WebForm1.aspx を表示します。
  2. フォームに別のボタンを追加します。そのボタンの Text プロパティと ID プロパティを、それぞれ "構成ファイルから文字列を解読" と "btnDecryptConfig" に設定します。
  3. ボタンをダブルクリックして、ボタン クリック イベント ハンドラを作成します。
  4. ファイルの先頭の既存の using ステートメントの下に次の using ステートメントを追加します。
using System.Configuration;
  1. btnDecryptConfig_Click イベント ハンドラに戻って、Web.config ファイルの <appSettings> セクションからデータベース接続文字列を取得するコードを追加します。
DataProtector dp = new DataProtector(DataProtector.Store.USE_MACHINE_STORE);
try
{
  string appSettingValue =
            ConfigurationSettings.AppSettings["connectionString"];
  byte[] dataToDecrypt = Convert.FromBase64String(appSettingValue);
  string connStr = Encoding.ASCII.GetString(
                               dp.Decrypt(dataToDecrypt,null));
  txtDecryptedData.Text = connStr;
}
catch(Exception ex)
{
  lblError.ForeColor = Color.Red;
  lblError.Text = "Exception.<br>" + ex.Message;
  return;
}
lblError.Text = "";

  1. [ビルド] メニューの [ソリューションのビルド] をクリックして、プロジェクトを再度ビルドします。
  2. Webform1.aspx を右クリックし、[ブラウザで表示] をクリックします。
  3. [暗号化するデータ] ボックスに、たとえば次のようにデータベース接続文字列を入力します。
server=(local);Integrated Security=SSPI; database=Northwind
  1. [暗号化] ボタンをクリックします。
  2. 暗号化された文字列を選択して、クリップボードにコピーします。
  3. Visual Studio .NET に切り替え、Web.config ファイルの <system.web> 要素の外に次の <appSettings> 要素を追加します。クリップボードにコピーした暗号化された状態の接続文字列を、value 属性の値として貼り付けます。
<appSettings>
   <add key="connectionString" value="encrypted connection string" /> 
</appSettings>

  1. Web.config を保存します。
  2. [構成ファイルから文字列を解読] ボタンをクリックして、暗号化されたデータベース接続文字列が Web.config ファイルから正常に読み取られ、その解読された接続文字列が [解読後のデータ] ボックスに正常に表示されていることを確認します。

参考資料

詳細については、このガイドの「パート IV : 参照」の次のトピックを参照してください。

patterns and practices home