如何在注册表中存储加密的连接字符串

原创 2004年09月16日 21:33:00

目标

本章的目标是:

在注册表中存储加密的数据库连接字符串

从注册表中读取加密的数据库连接字符串并对其进行解密。

适用范围

本章适用于以下产品和技术:

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 应用程序的经验。

按照如何创建加密库中所述创建常规加密库。此加密库所提供的功能在本章中用于为数据库连接字符串加密和解密。

请阅读第 12 章数据访问安全性中的安全存储数据库连接字符串。其中介绍了一些用于安全存储数据库连接字符串的技术。

摘要

如果开发人员所编写的应用程序需要访问数据库,那么他们都将面临一个相同的问题,即在哪个位置安全存储数据库连接字符串。注册表为他们提供了一种选择。不过,尽管使用访问控制列表 (ACL) 可保护单个注册表项的安全,但为了提高安全性,您应该先对连接字符串加密,然后才将其存储。

本章介绍如何将经过加密的数据库连接字符串存储在注册表中,以及如何从 ASP.NET Web 应用程序中检索它。它会用到您在如何创建加密库中创建的那个常规加密库。

您必须了解的背景知识

在开始学习本章之前,您应该知道:

用于加密的连接字符串、初始化向量和密钥将作为命名值存储在注册表中的以下注册表项下面。

HKEY_LOCAL_MACHINE/Software/TestApplication

必须存储初始化向量和密钥以便对连接字符串进行解密。

将加密数据存储在注册表中

此过程会创建一个 Windows 应用程序,用来为示例数据库字符串加密并将该字符串存储在注册表中。

在注册表中存储加密数据

1.

启动 Visual Studio .net,并创建一个新的名为 EncryptionTestApp 的 Visual C# 项目。

2.

添加对 Encryption.dll 程序集的引用。
要创建此程序集,必须执行本指南中如何创建加密库中所述的步骤。

3.

将下面的 using 语句添加到 Form1.cs 顶部现有 using 语句的下方。

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

4.

将表 1 中的控件加入 Form1,并如图 1 所示对它们进行排列。

表 1:EncryptionTestApp 控件

控件 文本 ID

标签

连接字符串:

 

文本框

 

txtConnectionString

标签

密钥:

 

文本框

 

txtKey

标签

初始化向量:

 

文本框

 

txtInitializationVector

标签

加密字符串

 

文本框

 

txtEncryptedString

标签

解密字符串

 

文本框

 

txtDecryptedString

按钮

加密

btnEncrypt

按钮

解密

btnDecrypt

按钮

写入注册表数据

btnWriteRegistryData

“加密测试套”对话框

图 1
“加密测试套”对话框

5.

txtConnectionStringText 属性设置为

"Server=local; database=pubs; uid=Bob; pwd=Password"

6.

txtKey Text 属性设置为

"0123456789012345"

密钥长度为 16 个字节以满足三重 DES 加密算法的要求。

7.

Form1 Text 属性设置为

"加密测试套"

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

确认编码值是 connectionStringinitVector key 命名值的当前值。

18.

关闭 regedit 和测试套应用程序。

创建 ASP.NET Web 应用程序

此过程开发一个简单的 ASP.NET Web 应用程序,它将从注册表中检索加密的连接字符串并对它进行解密。

创建 ASP.NET 应用程序

1.

创建一个名为 EncryptionWebApp 的新 Visual C# ASP.NET Web 应用程序。

2.

添加对 Encryption.dll 程序集的引用。
要创建此程序集,必须执行本指南中如何创建加密库中所述的步骤。

3.

打开 Webform1.aspx.cs,并将下面的 using 语句添加到文件顶部现有 using 语句的下面。

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

4.

将表 2 中所列的控件添加到 WebForm1.aspx 中。

表 2:WebForm1.aspx 控件

控件 文本 ID

标签

 

lblEncryptedString

标签

 

lblDecryptedString

按钮

获取连接字符串

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 窗体上就会显示加密和解密的连接字符串。

其他资源

有关详细信息,请参见本指南的如何创建加密库。


Windows Mobile 6.0的注册表修改详细教程+注册表编辑器

 修改之前请备份你的注册表... ...  我们先对注册表有个大致的了解。注册表大致上可以分为四组:  HKEY_CLASSES_ROOT:  用来放置一些资料的定义,如副档名的关联,资料的类别之类的...
  • strliu
  • strliu
  • 2009年11月18日 13:41
  • 859

如何加密Web.Config中的连接字符串

               对Encrypting Connection Strings in web.config file的介绍                                 ...
  • xbf321
  • xbf321
  • 2007年06月07日 16:31
  • 2366

数据库连接字符串的处理方法!加密解密连接字符串。

数据库连接字符串的处理方法!加密解密连接字符串。 标签: 数据库加密解密dllvb.netstring 2006-03-04 09:37 6938人阅读 评论(1) 收藏 举报 ...
  • u010265681
  • u010265681
  • 2017年08月03日 22:25
  • 455

C++从注册表中获取用户的历史记录

1.主要是读取注册表中HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs的值,至于怎么读取注册表。 C++中: HK...
  • helonSY
  • helonSY
  • 2011年11月17日 14:26
  • 1372

C#中数据库连接字符串写入配置文件

在C#2010中,如何保存和访问数据库的连接字符串呢? 在Winform下要新增App.config文件,在Asp.net下要新增web.config文件。 1.打开配置文件添加相关代码后...
  • u011981242
  • u011981242
  • 2016年04月07日 11:34
  • 1970

C#中将数据库连接字符串写成类方便多个界面调用

在C#中编制了大量界面,多数界面都需要与数据库交互,复制粘贴大量数据库连接字符串非常繁琐,且IP变化又需要进行大量修改。 原始连接字符串代码 添加引用 #region 引用 using Syst...
  • itiswangwang
  • itiswangwang
  • 2017年11月24日 11:35
  • 81

如何将一个加密连接字符串存储在注册表中

发布日期: 11/23/2004 | 更新日期: 11/23/2004浏览全部“安全性指南”主题Microsoft Corporation目标本模块用于: •将加密数据库连接字符串存储在注册表中。 •...
  • bh812
  • bh812
  • 2005年11月30日 16:13
  • 969

解禁注册表,启用MMC

       公司租用了远端主机(系统为WIN2003+SP2),需要设定组策略进行管制,在设定当中,先后把命令提示符、注册表、桌面、资源管理器等禁用,因一时大意,竟把MMC平台也设为禁用。退出系统后...
  • ggw128
  • ggw128
  • 2007年12月18日 08:55
  • 2338

数据库连接字符串的处理方法!加密解密连接字符串。

数据库连接字符串的处理应该是一个项目里最基础的东东了。(除非你的项目不涉及到数据库。)千万不要小看他,处理不好也时会给你带来不少的麻烦的。连接字符串的内容在这里就不讨论了,这里主要说一下他的存放位置和...
  • jyk
  • jyk
  • 2006年03月04日 09:37
  • 7646

改注册表实现的增加右键菜单右键菜单,注册自己的文件格式

注册自己的文件格式,并且让其与自己的程序相关联,Windows下,方法有两种:  一种是shell编程,系统提供了一些接口可以通过这些接口也能注册和关联自己的文件,由于过程繁琐,我们在这里不...
  • u012108436
  • u012108436
  • 2014年07月29日 16:44
  • 692
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在注册表中存储加密的连接字符串
举报原因:
原因补充:

(最多只允许输入30个字)