MSDN 首頁 

How To:將加密連接字串儲存在登錄中

發佈日期: 2004 年 5 月 28 日
本頁內容
目標目標
適用於適用於
如何使用本單元如何使用本單元
摘要摘要
您必須知道的事項您必須知道的事項
將加密資料儲存在登錄中將加密資料儲存在登錄中
建立 ASP.NET Web 應用程式建立 ASP.NET Web 應用程式
其他資源其他資源

目標

透過此單元即可:

將加密的資料庫連接字串儲存在登錄中。

從登錄中讀取加密的資料庫連接字串,並加以解密。

回到頁首回到頁首

適用於

本單元適用於下列產品及技術:

Microsoft Windows XP 或 Windows 2000 Server (含 Service Pack 3) 及更新的作業系統

Microsoft .NET Framework 1.0 版 (含 Service Pack 2) 及更新版本

Microsoft Visual C#® .NET

回到頁首回到頁首

如何使用本單元

若要充分瞭解此單元:

您必須具有使用 Visual C# .NET 進行程式設計的經驗。

您必須具有使用 Microsoft Visual Studio® .NET 開發環境的經驗。

您必須具有使用 ASP.NET 開發 Web 應用程式的經驗。

建立一般加密程式庫,其描述於<How To:建立加密程式庫>中。本程式庫提供本單元中用來加密及解密資料庫連接字串的功能。

請閱讀第 12 單元<資料存取安全性>中的<安全儲存資料庫連接字串>。當中提供了安全儲存資料庫連接字串技術的相關資訊。

回到頁首回到頁首

摘要

將資料庫連接字串儲存在何處最安全,是所有撰寫需要存取資料庫之應用程式的開發人員最常面對的問題。登錄是可以考慮的一個儲存位置。不過,雖然 Microsoft® Windows® 存取控制清單 (ACL) 可確保個別登錄機碼的安全,但為了加強安全性,您應該在加密完連接字串後,再儲存它們。

本單元描述如何將加密的資料庫連接字串儲存在登錄中,以及如何從 ASP.NET Web 應用程式擷取它。它使用<How To:建立加密程式庫>中建立的一般加密程式庫。

回到頁首回到頁首

您必須知道的事項

使用本單元之前,應該知道下列事項:

加密所用的連接字串、初始化向量及金鑰,將儲存在登錄中,作為下列登錄機碼下面的名稱值。

HKEY_LOCAL_MACHINE\Software\TestApplication

必須將初始化向量及金鑰儲存起來,以供解密連接字串之用。

回到頁首回到頁首

將加密資料儲存在登錄中

本程序會建立一個 Windows 應用程式,可用來加密範例資料庫字串,並將該字串儲存在登錄中。

將加密資料儲存在登錄中

1.

啟動 Visual Studio.NET,並建立名為 EncryptionTestApp 的新 Visual C# Windows 專案。

2.

加入 Encryption.dll 組件的組件參考。
若要建立此組件,您必須執行本手冊中<How To:建立加密程式庫>所描述的步驟。

3.

將下列 using 陳述式加入 Form1.cs 頂端,放在現有 using 陳述式之下。

using Encryption;
using System.Text;
using Microsoft.Win32;

4.

將表 1 中的控制項加入 Form1,並如圖 1 所示排列。

表 1:EncryptionTestApp 控制項

控制項文字ID

Label

連接字串:

 

TextBox

 

txtConnectionString

Label

金鑰:

 

TextBox

 

txtKey

Label

初始化向量:

 

TextBox

 

txtInitializationVector

Label

已加密的字串

 

TextBox

 

txtEncryptedString

Label

已解密的字串

 

TextBox

 

txtDecryptedString

Button

加密

btnEncrypt

Button

解密

btnDecrypt

Button

寫入登錄資料

btnWriteRegistryData

[加密測試控管] 對話方塊

圖 1
[加密測試控管] 對話方塊

5.

txtConnectionStringText 屬性設為

"Server=local; database=pubs; uid=林曉峰; pwd=Password"

6.

txtKeyText 屬性設為

"0123456789012345"

該金鑰長度為 16 位元組,以配合 Triple DES 加密演算法。

7.

Form1Text 屬性設為

"加密測試控管"

8.

按兩下 [加密] 按鈕,以建立按鈕啟動事件處理常式,並將下列程式碼加入事件處理常式。

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, 
                  "加密測試控管");
}

9.

返回「設計工具」模式中的 Form1,並按兩下 [解密] 按鈕,以建立按鈕啟動事件處理常式。

10.

將下列程式碼加入 [解密] 按鈕事件處理常式。

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, 
                  "加密測試控管");
}

11.

返回「設計工具」模式中的 Form1,並按兩下 [寫入登錄資料] 按鈕,以建立按鈕啟動事件處理常式。

12.

將下列程式碼加入事件處理常式。

// 建立登錄機碼及名稱值
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("資料已成功寫入登錄");

13.

執行應用程式,再按一下 [加密]。
加密的連接字串會顯示在 [已加密的字串] 欄位中。

14.

按一下 [解密]。
原始字串會顯示在 [已解密的字串] 欄位中。

15.

按一下 [寫入登錄資料]。

16.

在訊息方塊中按一下 [確定]。

17.

執行 regedit.exe 並檢視下列機碼的內容。

HKLM\Software\TestApplication

確認 connectionStringinitVectorkey 名稱值都是經過編碼的值。

18.

關閉 regedit 及測試控管應用程式。

回到頁首回到頁首

建立 ASP.NET Web 應用程式

本程序會開發一個簡單的 ASP.NET Web 應用程式,可從登錄中擷取加密的連接字串,並加以解密。

建立 ASP.NET 應用程式

1.

建立名為 EncryptionWebApp 的新 Visual C# ASP.NET Web 應用程式。

2.

加入 Encryption.dll 組件的組件參考。
若要建立此組件,您必須執行本手冊中<How To:建立加密程式庫>所描述的步驟。

3.

開啟 Webform1.aspx.cs,將下列 using 陳述式加入檔案的頂端,放在現有 using 陳述式之下。

using Encryption;
using System.Text;
using Microsoft.Win32;

4.

將表 2 所列的控制項加入 WebForm1.aspx。

表 2:WebForm1.aspx 控制項

控制項文字ID

Label

 

lblEncryptedString

Label

 

lblDecryptedString

Button

取得連接字串

btnGetConnectionString

5.

按兩下 [取得連接字串] 按鈕,以建立按鈕啟動事件處理常式。

6.

將下列程式碼加入事件處理常式。

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);

7.

在 [建置] 功能表上按一下 [建置方案]。

8.

在 [方案總管] 的 [Webform1.aspx] 上按一下滑鼠右鍵,再按一下 [在瀏覽器中檢視]。

9.

按一下 [取得連接字串]。
已加密及已解密的連接字串會顯示在 Web Form 上。

回到頁首回到頁首

其他資源

若需相關資訊,請參閱本手冊中的<How To:建立加密程式庫>。


回到頁首回到頁首