セキュリティ保護された ASP.NET アプリケーションの構築 : 認証、認定、および通信のセキュリティ保護 暗号化された接続文字列をレジストリに格納する方法
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 アプリケーションの構築」の開始ページを参照してください。
要約 : 接続文字列やアカウントの資格情報などの暗号化されたデータの格納場所として、アプリケーションが Windows レジストリを選択する場合があります。ここでは、暗号化された文字列をレジストリに格納する方法、およびその文字列を取り出す方法について説明します。
目次
データベースの接続文字列の格納場所にはいくつかの選択肢があります。レジストリはその選択肢の中の 1 つです。個々のレジストリ キーについては、Windows アクセス コントロール リスト (ACL) でセキュリティ保護することができますが、セキュリティをさらに高めるには、暗号化された接続文字列を格納する必要があります。
ここでは、このガイドの「パート IV : 参照」の「暗号化ライブラリを作成する方法」で作成した一般的な暗号化および解読クラス ライブラリを使用して、暗号化されたデータベース接続文字列をレジストリに格納し、その文字列を ASP.NET Web アプリケーションから取り出す方法について説明します。
ここで取り上げる手順を実行するには、先に暗号化クラス ライブラリ アセンブリを作成しておく必要があります。
データベース接続文字列を対象とした他の安全な格納場所と格納方法の詳細については、「第 12 章 データ アクセス セキュリティ」の「データベース接続文字列をセキュリティで保護して保存する」を参照してください。
メモ
- 暗号化で使用される接続文字列、初期化ベクタ (IV) およびキーは、次のレジストリ キーの下のレジストリに名前付きの値として格納されます。
HKEY_LOCAL_MACHINE\Software\TestApplication
- 初期化ベクタやキーは、接続文字列を解読できるように格納する必要があります。
必要条件
ハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、スキルと知識、およびサービス パックの必要条件は以下のとおりです。
- Microsoft® Windows® 2000 オペレーティング システム
- Microsoft Visual Studio® .NET 開発システム
また、ここで説明する手順には、Microsoft Visual C#® 開発ツールの知識も必要です。
The procedures in this article also require that you have knowledge of the Microsoft Visual C#™ development tool.
要約
ここでは、次の手順について説明します。
- 暗号化されたデータをレジストリに格納する。
- ASP.NET Web アプリケーションを作成する。
1. 暗号化されたデータをレジストリに格納する
次の手順により、サンプル データベース文字列を暗号化し、その文字列をレジストリに格納するときに使用する Windows アプリケーションを作成します。
■ 暗号化されたデータをレジストリに保存するには
Visual Studio .NET を起動して、"EncryptionTestApp" という名前の新しい C# Windows プロジェクトを作成します。
Encryption.dll アセンブリへのアセンブリ参照を追加します。
このアセンブリを作成するには、このガイドの「パート IV : 参照」の「暗号化ライブラリを作成する方法」で説明した手順を実行する必要があります。
Form1.cs の先頭の既存の using ステートメントの下に次の using ステートメントを追加します。
using Encryption;
using System.Text;
using Microsoft.Win32;
表 1 のコントロールを Form1 に追加し、図 1 のように配置します。
表1 EncryptionTestApp のコントロール
コントロール Text ID Label 接続文字列 TextBox txtConnectionString Label キー TextBox txtKey Label 初期化ベクタ TextBox txtInitializationVector Label 暗号化した文字列 TextBox txtEncryptedString Label 解読した文字列 TextBox txtDecryptedString Button 暗号化 btnEncrypt Button 解読 btnDecrypt Button レジストリ データを書き込む btnWriteRegistryData 図 1 [暗号化テスト用アプリケーション] ダイアログ ボックス
txtConnectionString の Text プロパティ を次のように設定します。
Server=local; database=pubs; uid=Bob; pwd=Password
- txtKey の Text プロパティ を次のように設定します。
"0123456789012345"
キーの長さは、Triple DES 暗号化アルゴリズムに合うよう 16 バイトになっています。
- Form1 の Text プロパティ を次のように設定します。
Encryption Test Harness
[暗号化] ボタンをダブルクリックしてボタン クリック イベント ハンドラを作成し、そのイベント ハンドラに次のコードを追加します。
try { // Create the encryptor object, specifying 3DES as the // encryption algorithm Encryptor enc = new Encryptor(EncryptionAlgorithm.TripleDes); // Get the connection string as a byte array byte[] plainText = Encoding.ASCII.GetBytes(txtConnectionString.Text); byte[] key = Encoding.ASCII.GetBytes(txtKey.Text); // Perform the encryption byte[] cipherText = enc.Encrypt(plainText, key); // Store the intialization vector, as this will be required // for decryption txtInitializationVector.Text = Encoding.ASCII.GetString(enc.IV); // Display the encrypted string txtEncryptedString.Text = Convert.ToBase64String(cipherText); } catch(Exception ex) { MessageBox.Show("Exception encrypting: " + ex.Message, "Encryption Test Harness"); }
デザイナ モードの Form1 に戻り、[解読] ボタンをダブルクリックしてボタン クリック イベント ハンドラを作成します。
[解読] ボタンのイベント ハンドラに次のコードを追加します。
try { // Set up the Decryptor object Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes); // Set the Initialization Vector dec.IV = Encoding.ASCII.GetBytes(txtInitializationVector.Text); byte[] key = Encoding.ASCII.GetBytes(txtKey.Text); // Perform the decryption byte[] plainText = dec.Decrypt(Convert.FromBase64String( txtEncryptedString.Text), key); // Display the decrypted string. txtDecryptedString.Text = Encoding.ASCII.GetString(plainText); } catch(Exception ex) { MessageBox.Show("Exception decrypting. " + ex.Message, "Encryption Test Harness"); }
デザイナ モードの Form1 に戻り、[レジストリ データを書き込む] ボタンをダブルクリックしてボタン クリック イベント ハンドラを作成します。
そのイベント ハンドラに次のコードを追加します。
// Create registry key and named values RegistryKey rk = Registry.LocalMachine.OpenSubKey("Software",true); rk = rk.CreateSubKey("TestApplication"); // Write encrypted string, initialization vector and key to the registry rk.SetValue("connectionString",txtEncryptedString.Text); rk.SetValue("initVector",Convert.ToBase64String( Encoding.ASCII.GetBytes(txtInitializationVector.Text))); rk.SetValue("key",Convert.ToBase64String(Encoding.ASCII.GetBytes( txtKey.Text))); MessageBox.Show("The data has been successfully written to the registry");
アプリケーションを実行し、[暗号化] をクリックします。
暗号化された接続文字列が [暗号化された文字列] フィールドに表示されます。
[解読] をクリックします。
元の文字列が [解読した文字列] フィールドに表示されます。
[レジストリ データを書き込む] をクリックします。
メッセージ ボックスで [OK] をクリックします。
regedit.exe を実行し、次のキーの内容を表示します。
HKLM\Software\TestApplication
- connectionString、"initVector"、および "key" という名前の値を探し、それらが暗号化されていることを確認します。
- レジストリ エディタ、およびテスト用アプリケーションを閉じます。
2. ASP.NET Web アプリケーションを作成する
ここでは、レジストリから暗号化された接続文字列を取り出して解読するシンプルな ASP.NET Web アプリケーションを開発します。
■ ASP.NET アプリケーションを作成するには
EncryptionWebApp という名前の新しい Visual C# ASP.NET Web アプリケーションを作成します。
Encryption.dll アセンブリへのアセンブリ参照を追加します。
このアセンブリを作成するには、このガイドの「パート IV : 参照」の「暗号化ライブラリを作成する方法」で説明した手順を実行する必要があります。
Webform1.aspx.cs ファイルを開き、ファイルの先頭の既存の using ステートメントの下に次の using ステートメントを追加します。
using Encryption;
using System.Text;
using Microsoft.Win32;
表 2 のコントロールを WebForm1.aspx に追加します。
表 2 WebForm1.aspx に配置するコントロール
コントロール Text ID Label lblEncryptedString Label lblDecryptedString Button 接続文字列を取得 btnGetConnectionString [接続文字列を取得] ボタンをダブルクリックして、ボタン クリック イベント ハンドラを作成します。
そのイベント ハンドラに次のコードを追加します。
RegistryKey rk = Registry.LocalMachine.OpenSubKey(
@"Software\TestApplication",false);
lblEncryptedString.Text = (string)rk.GetValue("connectionString");
string initVector = (string)rk.GetValue("initVector");
string strKey = (string)rk.GetValue("key");
Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes );
dec.IV = Convert.FromBase64String(initVector);
// Decrypt the string
byte[] plainText = dec.Decrypt(Convert.FromBase64String(
lblEncryptedString.Text),
Convert.FromBase64String(strKey));
lblDecryptedString.Text = Encoding.ASCII.GetString(plainText);
[ビルド] メニューの [ソリューションのビルド] をクリックします。
ソリューション エクスプローラで [Webform1.aspx] を右クリックし、[ブラウザで表示] をクリックします。
[接続文字列を取得] をクリックします。
暗号化した接続文字列、および解読した接続文字列が Web フォームに表示されます。
参考資料
詳細については、このガイドの「パート IV : 参照」の「暗号化ライブラリを作成する方法」を参照してください。