暗号化された接続文字列をレジストリに格納する方法
公開日: 2004年9月7日 | 最終更新日: 2004年9月7日
トピック
目的
適用対象
モジュールの使用方法
要約
前提知識
暗号化されたデータをレジストリに格納する
ASP.NET Web アプリケーションを作成する
関連資料
目的
このモジュールの目的は次のとおりです。
適用対象
このモジュールは、次の製品およびテクノロジを対象としています。
-
Microsoft® Windows® XP または Windows 2000 Server (Service Pack 3) 以降のオペレーティング システム
-
Microsoft .NET Framework Version 1.0 (Service Pack 2) 以降
-
Microsoft Visual C#® .NET
モジュールの使用方法
このモジュールをよく理解するには、次の前提が必要です。
-
Visual C# .NET を使用してプログラムを作成した経験があること。
-
Microsoft Visual Studio® .NET 開発環境を使用した経験があること。
-
ASP.NET を使用して Web アプリケーションを開発した経験があること。
-
「暗号化ライブラリを作成する方法」で説明されている汎用暗号化ライブラリを作成していること。このモジュールでデータベース接続文字列の暗号化および解読に使用される機能は、このライブラリから提供されます。
-
「モジュール 12 データ アクセス セキュリティ」の「データベース接続文字列をセキュリティで保護して保存する」を読んでいること。このモジュールには、データベース接続文字列を安全に格納するテクニックに関する情報が記載されています。
要約
データベース接続文字列を安全に格納できる場所については、データベース アクセスが必要なアプリケーションを作成する際に開発者が共通して直面する問題です。レジストリは、このような場合に考えられる格納場所の 1 つです。ただし、個々のレジストリ キーは、Microsoft Windows ACL (アクセス制御リスト) でセキュリティ保護できますが、セキュリティをさらに高めるには、接続文字列を暗号化してから格納する必要があります。
このモジュールでは、暗号化された接続文字列をレジストリに格納し、それを ASP.NET Web アプリケーションから取り出す方法について説明します。ここでは、「暗号化ライブラリを作成する方法」で作成した汎用暗号化ライブラリを使用します。
前提知識
このモジュールの使用を開始するときには、以下の点に注意してください。
-
暗号化で使用される接続文字列、初期化ベクタ (IV) およびキーは、次のレジストリ キーの下のレジストリに名前付きの値として格納されます。
HKEY_LOCAL_MACHINE\Software\TestApplication
-
初期化ベクタやキーは、接続文字列を解読できるように格納する必要があります。
暗号化されたデータをレジストリに格納する
ここでは、サンプル データベース文字列を暗号化し、その文字列をレジストリに格納するときに使用する Windows アプリケーションを作成します。
-
Visual Studio .NET を起動して、"EncryptionTestApp" という名前の新しい Visual C# Windows アプリケーション プロジェクトを作成します。
-
Encryption.dll アセンブリへのアセンブリ参照を追加します。
このアセンブリを作成するには、このガイドの「暗号化ライブラリを作成する方法」で説明した手順を実行する必要があります。
-
Form1.cs の先頭にある既存の using ステートメントの下に、次の using ステートメントを追加します。
using Encryption;
using System.Text;
using Microsoft.Win32;
-
表 1 のコントロールを Form1 に追加し、図 1 のように配置します。
表 1: EncryptionTestApp のコントロール
コントロールテキスト型 (Text)IDラベル接続文字列: TextBox txtConnectionStringラベルキー: TextBox txtKeyラベル初期化ベクタ: TextBox txtInitializationVectorラベル暗号化した文字列: TextBox txtEncryptedStringラベル解読した文字列: TextBox txtDecryptedStringボタン暗号化btnEncryptボタン解読btnDecryptボタンレジストリ データの書き込みbtnWriteRegistryData![[暗号化テスト用アプリケーション] ダイアログ ボックス](http://i.msdn.microsoft.com/Aa302406.secmod25_01(ja-jp,MSDN.10).jpg)
図 1
[暗号化テスト用アプリケーション] ダイアログ ボックス
-
txtConnectionString の Text プロパティを次のように設定します。
"Server=local; database=pubs; uid=矢野; pwd=Password"
-
txtKey の Text プロパティを次のように設定します。
"0123456789012345"
キーの長さは、Triple DES 暗号化アルゴリズムに合うよう 16 バイトになっています。
-
Form1 の Text プロパティを次のように設定します。
"暗号化テスト用アプリケーション"
-
[暗号化] ボタンをダブルクリックしてボタン クリック イベント ハンドラを作成し、そのイベント ハンドラに次のコードを追加します。
try
{
// encryptor オブジェクトを作成し
// 暗号化アルゴリズムとして 3DES を指定する
Encryptor enc = new Encryptor(EncryptionAlgorithm.TripleDes);
// 接続文字列をバイト配列で取得する
byte[] plainText = Encoding.ASCII.GetBytes(txtConnectionString.Text);
byte[] key = Encoding.ASCII.GetBytes(txtKey.Text);
// 暗号化を実行する
byte[] cipherText = enc.Encrypt(plainText, key);
// 解読に必要なので
// 初期化ベクタを格納する
txtInitializationVector.Text = Encoding.ASCII.GetString(enc.IV);
// 暗号化した文字列を表示する
txtEncryptedString.Text = Convert.ToBase64String(cipherText);
}
catch(Exception ex)
{
MessageBox.Show("暗号化中に次の例外が発生しました: " + ex.Message,
"暗号化テスト用アプリケーション");
}
-
デザイナ モードで Form1 に戻り、[解読] ボタンをダブルクリックして、ボタン クリック イベント ハンドラを作成します。
-
[解読] ボタンのイベント ハンドラに次のコードを追加します。
try
{
// Decryptor オブジェクトを設定する
Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes);
// 初期化ベクタを設定する
dec.IV = Encoding.ASCII.GetBytes(txtInitializationVector.Text);
byte[] key = Encoding.ASCII.GetBytes(txtKey.Text);
// 解読を実行する
byte[] plainText = dec.Decrypt(Convert.FromBase64String(
txtEncryptedString.Text),
key);
// 解読した文字列を表示する
txtDecryptedString.Text = Encoding.ASCII.GetString(plainText);
}
catch(Exception ex)
{
MessageBox.Show("解読中に例外が発生しました。 " + ex.Message,
"暗号化テスト用アプリケーション");
}
-
デザイナ モードで Form1 に戻り、[レジストリ データの書き込み] ボタンをダブルクリックして、ボタン クリック イベント ハンドラを作成します。
-
作成したイベント ハンドラに次のコードを追加します。
// レジストリ キーと名前付きの値を作成する
RegistryKey rk = Registry.LocalMachine.OpenSubKey("Software",true);
rk = rk.CreateSubKey("TestApplication");
// 暗号化した文字列、初期化ベクタ、およびキーをレジストリに書き込む
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("データのレジストリへの書き込みに成功しました。");
-
アプリケーションを実行して、[暗号化] をクリックします。
暗号化された接続文字列が [暗号化した文字列] ボックスに表示されます。
-
[解読] をクリックします。
元の文字列が [解読した文字列] ボックスに表示されます。
-
[レジストリ データの書き込み] をクリックします。
-
メッセージ ボックスで [OK] をクリックします。
-
regedit.exe を実行し、次のキーの内容を表示します。
HKLM\Software\TestApplication
"connectionString"、"initVector"、および "key" という名前の値を探し、それらが暗号化されていることを確認します。
-
レジストリ エディタ、およびテスト用アプリケーションを閉じます。
ASP.NET Web アプリケーションを作成する
ここでは、レジストリから暗号化された接続文字列を取り出して解読するシンプルな ASP.NET Web アプリケーションを作成します。
-
"EncryptionWebApp" という名前の新しい Visual C# ASP.NET Web アプリケーションを作成します。
-
Encryption.dll アセンブリへのアセンブリ参照を追加します。
このアセンブリを作成するには、このガイドの「暗号化ライブラリを作成する方法」で説明した手順を実行する必要があります。
-
Webform1.aspx.cs ファイルを開き、ファイルの先頭にある既存の using ステートメントの下に、次の using ステートメントを追加します。
using Encryption;
using System.Text;
using Microsoft.Win32;
-
表 2 のコントロールを WebForm1.aspx に追加します。
表 2: WebForm1.aspx に配置するコントロール
コントロールテキスト型 (Text)IDラベル lblEncryptedStringラベル lblDecryptedStringボタン接続文字列を取得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);
// 文字列を解読する
byte[] plainText = dec.Decrypt(Convert.FromBase64String(
lblEncryptedString.Text),
Convert.FromBase64String(strKey));
lblDecryptedString.Text = Encoding.ASCII.GetString(plainText);
-
[ビルド] メニューの [ソリューションのビルド] をクリックします。
-
ソリューション エクスプローラで、Webform1.aspx を右クリックして、[ブラウザで表示] をクリックします。
-
[接続文字列を取得] をクリックします。
暗号化した接続文字列、および解読した接続文字列が Web フォームに表示されます。
関連資料
詳細については、このガイドの「暗号化ライブラリを作成する方法」を参照してください。