扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:开发者在线 来源:开发者在线 2007年8月17日
关键字: Tony Patton 配置文件 加密
.NET Framework从2.0版本开始就引进了加密技术来支持配置文件。上个星期的文章主要关注使用ASP.NET 命令行工具加密部分配置文件,这个星期的文章包括编码选项。在代码中,.NET Framework库对控制加密和解密提供了完全支持。我下面所举的例子,使用了VB.NET和C#两种语言来向大家演示配置文件节的加密和解密。
保护敏感数据
即使用户访问了配置文件,你也可以通过加密配置数据,使用户很难看到配置文件的数据来提高应用软件的安全性。在ASP.NET中有两种受保护的配置提供者,它们分别是:RSAProtectedConfigurationProvider和 DPAPIProtectedConfigurationProvider。RSAProtectedConfigurationProvider使用RSACryptoServiceProvider来加密配置文件节,这里的配置文件节使用RSA公共密钥加密方法来加密和解密数据。
DPAPIProtectedConfigurationProvider使用Windows Data Protection API (DPAPI)来加密配置文件节,这里的配置文件节使用内置的Windows密码系统。如果有必要你也可以创建你自己的受保护的设置提供者。虽然用户很难处理加密数据,但是ASP.NET处理加密数据却易如反掌。在ASP.NET代码你可以使用这两个提供者。
使用代码
.NET Framework 2.0允许你在Web配置文件和机器配置文件中加密大部分配置节。System.Web.Configuration命名空间过去习惯于通过代码加密配置文件。它包括两种方法进行加密:ProtectSection方法和UnprotectSection方法。
作为一个例子,下面这个简单的ASP.NETweb.config文件演示了配置数据的加密和解密:
<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings>
<add name="db" connectionString="connection details" />
</connectionStrings>
<system.web>
<compilation debug="false" />
<authentication mode="Windows" />
</system.web>
</configuration>
下面的VB.NET代码来自ASP.NET Web表格加密文件的connectionStrings部分:
Public Sub Page_Load()
Dim config As Configuration
Dim configSection As ConfigurationSection
config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)
If Not (config Is Nothing) Then
configSection = config.GetSection("connectionStrings")
If Not (configSection Is Nothing) Then
If Not (configSection.SectionInformation.IsLocked) Then
configSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider")
config.Save()
End If
End If
End If
End Sub
代码执行下面步骤:
等价的C#代码如下:
protected void Page_Load(object sender, EventArgs e) {
Configuration config;
ConfigurationSection configSection;
config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
configSection = config.GetSection("connectionStrings");
if (configSection != null) {
if (!(configSection.SectionInformation.IsLocked)) {
configSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
config.Save();
} } }
一旦这个代码运行,现在,我的web.config文件中的connectionStrings节显示的内容将如下所示:
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAaZ2eussTfEmhwe+kgLsWVwQAAAACAAAAAAADZgAAqAAAABAAAADnyhn4dHzOLGFsIj8QUrXgAAAAAASAAACgAAAAEAAAAKFRR3MAelpxxV6J+KEhfqnQAAAAFJOBaI5ciKhw3Ywra+G0hkZb67k0YTJmXYe5+5cpZ3Wd3H2696mEhAGQiTecOVGixqtF9lHa+QipmMSHcVECiWYjOh/6CIQL6GED37erb4TLZSNo4U7FrE2JscNCnKaKZUtvnxVqRmjcDWU7Gm2rYRAHoDSEy0UE7ebbcqr7LQ+Y+C7WrFk+VKf6NmN4js4vl7TJXl/Nr36Z65bvZDCxcle66rZ2yebtXMTP2bX95NasbQx0trvnjJrdIdMMrLOqLDPhQLwZ4ObCxkh+Rlg4NxQAAABU+1akHFhrg+4d0AmCGE8Egt3HrA==</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
下面的代码是VB.NET解密节代码,同时显示了它的值:
Public Sub Page_Load()
Dim config As Configuration
Dim configSection As ConfigurationSection
config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)
configSection = config.GetSection("connectionStrings")
If Not (configSection Is Nothing) Then
If Not (configSection.SectionInformation.IsLocked) Then
configSection.SectionInformation.UnprotectSection()
config.Save()
End If
End If
End Sub
这个解密代码除了对指定的节调用UnprotectSection方法进行解密与先前的例子不同之外,其它部分都与先前的例子一样。等价的C#代码如下:
protected void Page_Load(object sender, EventArgs e) {
Configuration config;
ConfigurationSection configSection;
config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
configSection = config.GetSection("connectionStrings");
if (configSection != null) {
if (!(configSection.SectionInformation.IsLocked)) {
configSection.SectionInformation.UnprotectSection();config.Save();
} } }
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者