セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 ASP.NET から DPAPI (コンピュータ ストア) を使用する方法
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 マネージ クラス ライブラリを作成してください。
要約
ここでは、次の手順について説明します。
- ASP.NET クライアント Web アプリケーションを作成する。
- アプリケーションをテストする。
- 暗号化された接続文字列を Web.Config から読み取ることができるように Web アプリケーションを修正する。
1. ASP.NET クライアント Web アプリケーションを作成する
ここでは、Web.config ファイルに格納されているデータの暗号化と解読を行うために DPAPI クラス ライブラリを呼び出す ASP.NET クライアント Web アプリケーションを作成します。
■ ASP.NET クライアント Web アプリケーションを作成するには
Visual Studio .NET を起動し、"DPAPIClientWeb" という名前の新しい C# ASP.NET Web アプリケーションを作成します。
「DPAPI ライブラリを作成する方法」で作成した DataProtector.dll アセンブリへの参照を追加します。
WebForm1.aspx.cs ファイルを開き、ファイルの先頭の既存の using ステートメントの下に次の using ステートメントを追加します。
using System.Text;
using DataProtection;
表 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 フォーム
[暗号化] ボタンをダブルクリックして、ボタン クリック イベント ハンドラを作成します。
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 = "";
- 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 = "";
- [ビルド] メニューの [ソリューションのビルド] をクリックします。
2. アプリケーションをテストする
ここでは、Web アプリケーションをテストして、データの暗号化と解読が正常に行われるかどうかを確認します。
■ アプリケーションをテストするには
Ctrl キーを押しながら F5 キーを押して、Web アプリケーションを実行します。
[暗号化するデータ] ボックスに文字列を入力し、[暗号化] をクリックします。 Base64 エンコード形式で暗号化されたデータが [暗号化後のデータ] ボックスに表示されていることを確認します。
[解読] ボタンをクリックします。
暗号化されていたデータが正常に解読され、[解読後のデータ] ボックスに表示されることを確認します。
3. 暗号化された接続文字列を Web.Config から読み取ることができるように Web アプリケーションを修正する
ここでは、暗号化されたデータベース接続文字列をアプリケーションの Web.config ファイルの <appSettings> 要素に記述します。次に、Web.config ファイルから暗号化された文字列を読み取り、解読するコードを追加します。
■ 暗号化された接続文字列を Web.Config から読み取ることができるように Web アプリケーションを修正するには
- Visual Studio .NET に戻り、デザイナ モードで WebForm1.aspx を表示します。
- フォームに別のボタンを追加します。そのボタンの Text プロパティと ID プロパティを、それぞれ "構成ファイルから文字列を解読" と "btnDecryptConfig" に設定します。
- ボタンをダブルクリックして、ボタン クリック イベント ハンドラを作成します。
- ファイルの先頭の既存の using ステートメントの下に次の using ステートメントを追加します。
using System.Configuration;
- 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 = "";
- [ビルド] メニューの [ソリューションのビルド] をクリックして、プロジェクトを再度ビルドします。
- Webform1.aspx を右クリックし、[ブラウザで表示] をクリックします。
- [暗号化するデータ] ボックスに、たとえば次のようにデータベース接続文字列を入力します。
server=(local);Integrated Security=SSPI; database=Northwind
- [暗号化] ボタンをクリックします。
- 暗号化された文字列を選択して、クリップボードにコピーします。
- Visual Studio .NET に切り替え、Web.config ファイルの <system.web> 要素の外に次の <appSettings> 要素を追加します。クリップボードにコピーした暗号化された状態の接続文字列を、value 属性の値として貼り付けます。
<appSettings>
<add key="connectionString" value="encrypted connection string" />
</appSettings>
- Web.config を保存します。
- [構成ファイルから文字列を解読] ボタンをクリックして、暗号化されたデータベース接続文字列が Web.config ファイルから正常に読み取られ、その解読された接続文字列が [解読後のデータ] ボックスに正常に表示されていることを確認します。
参考資料
詳細については、このガイドの「パート IV : 参照」の次のトピックを参照してください。
- このガイドの「パート IV : 参照」の「DPAPI ライブラリを作成する方法」
- このガイドの「パート IV : 参照」の「ASP.NET と Enterprise Services から DPAPI (ユーザー ストア) を使用する方法」