介绍

这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串

背景描述

在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, Ajax, JavaScript等的文章。大多数情况下,我都把数据库的连接字符串放在了web.config中。其中包含许多敏感信息,包括连接数据库的用户名密码等。然而我们在web.config和machine.config中以纯文本的方式保存密码安全吗?

如果我们的程序只是部署在内部服务器中,这应该没什么问题。但如果我们的程序是运行在共享主机上面,那我们应该提高安全等级了。ASP. NET 2.0提供了一个保护配置模型来加密和解密web.config中sections信息。RSAProtectedConfigurationProvider:默认通过RSA公钥来加密和解密。

通过在命令行中工具运行aspnet_regiis.exe命令,可以对web.config中的连接串进行加密和解密。

第一种方式

首先,我们通过在windows命令行中执行aspnet_regiis.exe来加密与解密。

在VS中创建一个新的websit项目,打开web.config,加入数据库连接串,如:

然后我们按下面的步骤来加密和解密数据连接串

 <connectionStrings><add name="dbconnection" connectionString="Data Source=RahulMittal;Integrated Security=true;Initial Catalog=MySampleDB"/></connectionStrings >

1. 开始菜单>>所有程序>>Microsoft visual studio 2008 >> Visual Studio Tools >> Visual Studio 2008 开发人员命令提示(如果是windows7,点右键与管理员身份运行)

2. 在命令窗口中,输入命令 aspnet_regiis.exe -pef "connectionStrings" "C:\VisualStudio2008\Authorization"

–pef表明程序是以文件系统的形式建立的。第二个“connectionStrings”是你要加密的configuration 节点名字。第三个参数指名 web.config的物理路径。

3. 成功执行命令后会显示:加密成功。

现在,再打开程序中的 web.config,会变成像下面这样子了。

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"><EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><KeyName>Rsa Key</KeyName></KeyInfo><CipherData><CipherValue>ZNUbIEnOwlZzC8qbzHj5F2GS9gLYSkWCIgCJGkrgZAX8A+8oEIssyohhxUKvAubD3jizFc5IjbLGt7HNXhoFhXNTUPYz2y6tdKJDVgDmtCgVf8Z2C990zoMRBJG+VXhmgnlo1vtHYhGx8x/bBzE1prT1+xDpep98vHF22d+LrVI=</CipherValue></CipherData></EncryptedKey></KeyInfo><CipherData><CipherValue>tODWlPD0Q/B/mP14GQ/5tUxcjmhHcy9a0oPunV5osNrMQRztgi2h5V6sxJOEh+NC+G9gQNkv1huXf1s7eoZRRLy5/LDtLXzzqMUOqLSlJUs9igChvi33c9XG4rwGF15Tpn4N34bpQBt94n0rpSkQ18V9HCPzii+UO64PlA+ykDeQhc9aQr4gO3mCfUzmY2S9gsXzRbzdq0oCWBDvx8UkX2uDxaysVHC9Fo7u6IrlpU0+hOdK95Y3/A==</CipherValue></CipherData></EncryptedData></connectionStrings>

我们在程序中并不要写任何代码来解密连接字符串,因为.NET会自动的为我们解密。如果我们要用连接字符串,可以像平常那样调用.

string strconnection = ConfigurationManager.AppSettings["dbconnection"].ToString();

如果我们想解密,只需要在VS的命令窗口中,输入aspnet_regiis.exe -pdf "connectionStrings" "C:\VisualStudio2008\Authorization"
成功执行后,会显示解密成功。
再打开web.config,我们可以看到解密后的字符串。

现在,我们知道了如何在文件系统中加密和解密连接字符串。如果我们想加密运行在IIS上的默认网站,就像IE上展示的那样,可以用下面的命令。

加密IIS默认网站的web.config

aspnet_regiis.exe -pe "connectionStrings" -app "/SampleWebSite"

-pe说明程序是运行在IIS上的。第二个参数指名要加密的configuration节点。-app用来指定虚拟目录,最后一个参数就是程序部署的虚拟目录名。

Decrypt connectionStrings in web.config of IIS based site

解密IIS默认网站上的web.config

aspnet_regiis.exe -pd "connectionStrings" -app "/SampleWebSite"

到这里我们知道如何用命令行工具执行aspnet_regiis.exe命令来加密和解密web.config了。下面我将介绍如何在后台代码中来加密解密web.config。

第二种方式

在第二种方法中我会用RSAProtectedConfigurationProvider和DataProtectionConfgurationProvider来加密解密web.config

首先,打开Default.aspx,添加如下代码:

<html xmlns="http://www.w3.org/1999/xhtml"><head  runat="server"><title>Untitled Page</title></head><body><form id="form1"  runat="server"><div><asp:Button id="btnEncrypt" runat="server" Text="Encrypt" onclick="btnEncrypt_Click" /><asp:Button ID="btnDecrypt" runat="server" Text="Decrypt" onclick="btnDecrypt_Click" /></div></form></body></html>

打开后台代码,添加下列命名空间:

using System;
using System.Configuration;
using System.Web.Configuration;

再添加如下代码

string provider = "RSAProtectedConfigurationProvider";
string section = "connectionStrings";
protected void Page_Load(object sender, EventArgs e)
{}
protected void btnEncrypt_Click(object sender, EventArgs e)
{Configuration confg = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);ConfigurationSection configSect = confg.GetSection(section);if (configSect != null){configSect.SectionInformation.ProtectSection(provider);confg.Save();}
}protected void btnDecrypt_Click(object sender, EventArgs e)
{Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);ConfigurationSection configSect = config.GetSection(section);if (configSect.SectionInformation.IsProtected){configSect.SectionInformation.UnprotectSection();config.Save();}
}

完成之后,打开web.config,添加数据库连接字符串

 <connectionStrings><add name="dbconnection" connectionString="Data Source=RahulMittal;Integrated Security=true;Initial Catalog=MySampleDB"/></connectionStrings >

现在运行程序并点击加密按钮之后,再打开web.config,会变成下面那样:

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"><EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><KeyName>Rsa Key</KeyName></KeyInfo><CipherData><CipherValue>WagJ9DDjWTNc1nmYVNQXaQqXalQzXaiCHAOtUJvTWBRZiuT6UK1fBElM80PnL6dC5Umb8qvfHdkSMgoMW9CJzwOTZ0zTy17JBGZqRQmlfW2G9LacoWIil0UrxjhgmJmRXhwXHFpdGwEVl7AoQGVlJGabXuChutaTxmfGOoUbCr0=</CipherValue></CipherData></EncryptedKey></KeyInfo><CipherData><CipherValue>qry5qnr3qxOgyoNPeP7OKEiHpr/PPTsaeQ2mYUsSK7cg4Kkl9uPO4RyUXgBIkgCTsjbObqLlyndcSBnYyek6bxG/IBL82G1R5J1ci8i1eyt8kIDqouzYOx5vtouErld4z1L+7WGf9Wg37QAH5RiiEfkCHndJJq3dTqjxnnXZSno6NgbxSXDfqzwE/eKDVhGV3oaTQSfjVmO8e5a9wvREYeeyasDhojx8J2mdy7/Q9rEIpv98RTiRxA==</CipherValue></CipherData></EncryptedData></connectionStrings>

如果我们想用DataProtectionConfigurationProvider来实现加密与解密,只需在代码中将RSAProtectedConfigurationProvider替换成DataProtectionConfigurationProvider即可。

原文:http://www.codeproject.com/Tips/304638/Encrypt-or-Decrypt-Connection-Strings-in-web-confi

转载于:https://www.cnblogs.com/Gyoung/p/3194467.html

(译)利用ASP.NET加密和解密Web.config中连接字符串相关推荐

  1. Web.config中连接字符串的加密和解密

    Web.config中连接字符串的加密和解密  我们采用命令行的方式进行加密和解密.使用ASP.NET2.0提供的命令行工具aspnet_regiis.exe,该应用程序位系统目录下Microsoft ...

  2. Web.config中连接字符串的加密和解密[转载]

    我们采用命令行的方式进行加密和解密.使用ASP.NET2.0提供的命令行工具aspnet_regiis.exe,该应用程序位系统目录下Microsoft.NET\Framework\版本号\文件夹中. ...

  3. ASP.NET web.config中数据库连接字符串connectionStrings节的配置方法

    ASP.NET web.config中数据库连接字符串connectionStrings节的配置方法 第一种情况,本地开发时,使用本地数据库,如下面的代码 <connectionStrings& ...

  4. [转]web.config保护连接字符串及其它设置信息

    [转]web.config保护连接字符串及其它设置信息 本文英文原版及代码下载: http://www.asp.net/learn/data-access/tutorial-73-cs.aspx Sc ...

  5. PetShop 4.0知识点:加密和解密Web.config文件的配置节

    PetShop 4.0 中Web.config文件中的连接字符串是加密的,需要进行解密才能看到. 这个问题PetShop 4.0的ReadMe文件中有说明: Encrypting and Decryp ...

  6. web.config中配置字符串中特殊字符的处理

    配置文件中往往要用到一些特殊的字符, Web.Config默认编码格式为UTF-8,对于XML文件,要用到实体转义码来替换.对应关系如下: 字符 转义码 & 符号 & & 单引 ...

  7. 解决打不开 RSA 密钥容器 即:加密web.config中的内容

    简单的解决方法: WebConfig 加解密,未能使用提供程序"RsaProtectedConfigurationProvider"进行解密.提供程序返回错误消息为: 打不开 RS ...

  8. asp.net权限控制配置web.config

    项目下 有三个文件夹 A,B,C 验正方式是 Forms 验正 我要设置他们的访问权限为, A,匿名可访问 B,普通用户授权后才能访问 C,只允许管理员访问 <configuration> ...

  9. 在Windows和Azure中使用加密证书提高web.config的安全性

    \ 本文要点 \\ 加密证书可限制具有机密访问权限的人数.\\t 加密证书本身并不会降低对稳健性和多层安全计划的需求.\\t pfx解密密钥文件必须存储在一个安全的离线位置,并与密码分开存储.\\t ...

最新文章

  1. C++11中weak_ptr的使用
  2. scipy minimize当目标函数需要参数、当约束条件特别特别多时
  3. Spring嵌套事务控制
  4. 值得收藏!268条PCB layout设计规范
  5. [转]解决Android studio升级到3.5的一些问题
  6. php 筛选数组,2020-07-24 php 通过数组键值对筛选数组
  7. 对象(sqlca、sqlsa、sqlda)
  8. python多个矩阵横向连接
  9. 找到7天内要过生日的记录
  10. 一看就懂:正则表达式
  11. webpack4.0关闭开发环境的代码压缩UglifyJsPlugin
  12. [BZOJ1921] [CTSC2010]珠宝商
  13. SAP S/4 HANA物料账实际成本:理解版本迁移时的基本改变和影响
  14. 大数据智能交通未来会是怎样的交通状况?
  15. ERP专业知识讲座:7.财务管理
  16. Unity在XR设备中获取手柄的按键信息
  17. 地热井监测控制系统解决方案
  18. java毕业设计客观题考试mybatis+源码+调试部署+系统+数据库+lw
  19. Linux下创建超级用户
  20. 功能测试和自动化测试的优缺点

热门文章

  1. BZOJ-1798 维护序列
  2. SQL Server 2008 R2如何生成带数据的数据库脚本
  3. 诡异的DateTime.TryParseExact方法
  4. 硅谷企業面臨新的反壟斷枷鎖
  5. 1. ThreadPoolExecutor的一个常用的构造方法
  6. Django 学习笔记第一课
  7. 更改exe程序图标_更改电脑文件夹颜色、样式、图标,让文件夹不再是单一的黄色...
  8. c语言循环链表中设立尾链表,C语言实现双向非循环链表(带头结点尾结点)的节点插入...
  9. 产品经理需要懂技术吗?懂到什么程度?
  10. python 3.6 tensorflow_无法在python 3.6中导入Tensorflow