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

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

目标

本章的目标是:

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

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

适用范围

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

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

其他资源

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


Navicat加密密码逆向实战:从注册表提取到PHP解密的完整过程 本文详细解析了Navicat数据库管理工具的密码加密机制,从注册表提取加密密码到PHP实现完整解密的实战过程。涵盖Navicat 11的Blowfish算法和Navicat 12的AES-128-CBC加密技术,提供可操作的解密代码和安全建议,帮助用户理解并应对数据库密码存储的安全问题。 阅读详情

相关推荐

Navicat密码存储机制解析:AES-CBC加密原理与Python实战解密

AES(高级加密标准)作为当前主流的对称加密算法,通过固定长度的密钥对数据进行加密解密,广泛应用于数据安全保护领域。其CBC(密码分组链接)模式通过引入初始化向量(IV)和链式加密机制,有效增强了数据的安全性。在数据库管理工具中,密码的安全存储是保障数据访问权限的关键环节。Navicat作为常用的数据库管理软件,采用AES-CBC模式对连接密码进行加密存储,但使用了固定的硬编码密钥,这虽然方便了配置迁移,但也带来了潜在的安全风险。理解这一机制,不仅有助于在忘记密码时进行合法的数据恢复,还能提升对日常工具安

weixin_28607671的博客 270

解密navicat保存的MYSQL密码

忘记mysql账户密码时,可以查看navicat储存在注册表里面的加密口令字符串,用该工具来还原密码 需要.net 4.5环境

Navicat密码找回全解析:从DES加密原理到PHP解密脚本实现

在数据库管理实践中,密码安全存储与恢复是运维和开发人员常面临的基础问题。对称加密算法如DES(Data Encryption Standard)通过固定密钥对敏感信息进行加密,其ECB模式因实现简单而广泛应用于早期配置存储。理解其加密原理不仅能提升数据安全意识,也为解决实际工程问题提供思路。当Navicat等数据库工具采用DES-ECB模式并配合固定密钥派生策略时,加密过程虽保护了密码明文,但因算法和密钥公开,使得在合法权限下进行密码恢复成为可能。这一技术价值在于,当因配置迁移、密码遗忘或交接需要时,可通过

weixin_29323049的博客 349

注册表加密解密

注册表加密解密

系统注册表加密解密

系统注册表加密解密  注册表存储了大量与系统运行密切相关的配置信息,如果这些信息被错误修改或删除,就可能导致应用程序或系统运行不稳定,甚至导致系统崩溃。要保证注册表不被人为破坏,一个重要的手段就是对其加密。  1.加密系统注册表  (1)禁止使用注册表编辑器  Regedit.exe是Windows自带的注册表编辑软件,通常使用它对注册表进行修改。禁止使用注册表编辑器,在一...

weixin_34097242的博客 1962

注册表 DES加密

这里可以对注册表一个详细认识与操作,除了本地保存例如XML,INI,TXT,这里是存储注册码和注册时间的地方,所以看这个结合看注册码相关的资料会有很大帮助。 使用Registry和RegistryKey操作注册表 Registry 类 此类提供在运行 Windows 的计算机上的注册表中找到的标准根项集。注册表是一个存储设备,包含有关应用程序、用户和默认系统设置的信息。例如,应用程序可使用注册表存储在应用程序关闭后需要保留的信息,并可在应用程序重新加载时访问这些信息。例如,可以存储颜色首选项、屏幕位置或窗

qq_28014453的博客 714

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

发布日期: 11/23/2004 | 更新日期: 11/23/2004浏览全部“安全性指南”主题Microsoft Corporation目标本模块用于: •将加密数据库连接字符串存储注册表中。 •从注册表中读取加密数据库连接字符串并将其解密。 适用于:本模块适用于下列产品和技术: •Microsoft® Windows® XP 或 Windows 2000 Server(带 Service P

泓七人生 1401

【编程技巧】如何在注册表存储加密连接字符串

本页内容 目标 适用范围 如何使用本章内容

749

如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串

文章编号 : 329290 最后修改 : 2006年4月10日 修订 : 8.0 重要说明:本文包含有关如何修改注册表的信息。修改注册表之前,一定要先进行备份,并且一定要知...

tiandirensoon 78

Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication

The registry represents one possible location for an application to store database connection strings. Although individual registry keys can be secured with Windows access control lists (ACLs), for ad

denal的专栏 994

C#操作注册表,对字符串加密等的类

用Vs2005 C#开发的操作注册表的类, 对字符串进行加密的类

Navicat数据库密码反解密.rar

本地连接Navicat,数据库长时间忘记密码,分享密码,注册表加密密码反解析,放心给力

PassRegistry-Keeper:在 Windows 注册表加密存储密码

注册表 在 Windows 注册表加密存储密码

Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication (转)

Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication (转)[@more@]The regis...

csd3176的博客 769

Frechet Audio Distance(FAD)完整指南:原理、安装与音乐增强评估实战

Fréchet Audio Distance(FAD)是本仓库 `frechet_audio_distance` 模块提供的**参考无关(reference-free)音频生成质量评估指标**,它不依赖人工标注或成对参考样本,而是通过对比真实音频与生成音频在 VGGish 嵌入空间中的分布差异来衡量生成质量,特别适用于音乐增强(music enhancement)等音频生成任务。本文将结合仓库源码

gitblog_00658的博客 859

InstallSQLState.sql

 /* First uninstall - this section is exactly the same as uninstall.sql */USE masterGO/* Drop the database containing our sprocs */IF DB_ID(ASPState) IS NOT NULL BEGIN    DROP DATABASE ASPStateEND

sfz_roger的专栏 1427

两种加密技术共同构建安全的ASP.NET数据访问

关键词ASP.NET 数据访问安全性  数据库连接字符串 加密解密 注册表存储概述目前大多数面向企业级的ASP.NET应用系统都不可避免的要访问数据库中的内容,然而进行交互的数据无论是数据库连接的信息还是提交表单中的内容都不可避免的要在网络上传播,从某个客户端到Web服务器再到数据库服务器,这样就有可能发生数据的泄漏甚至数据库被入侵。为了保障数据的安全性,尤其是Web服务器上数据库访问信息的安全性

blue_sky_blue_heart的专栏 2799
上一篇: 键盘ASCII代码
下一篇: 在crystalReport(水晶报表)动态输入参数(转)
abaowu
博客等级 码龄22年 68粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值