科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件[Tony Patton]通过代码加密.NET配置文件

[Tony Patton]通过代码加密.NET配置文件

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

.NET Framework 2.0允许你在Web配置文件和机器配置文件中加密大部分配置节。System.Web.Configuration命名空间过去习惯于通过代码加密配置文件。它包括两种方法进行加密:ProtectSection方法和UnprotectSection方法。

作者:开发者在线 来源:开发者在线 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方法。

  • 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

代码执行下面步骤:

  • 它使用System.Web.Configuration命名空间与必要的类一起工作。
  • 它通过OpenWebConfiguration方法的WebConfigurationManager类访问应用程序的web.config文件。
  • 它通过GetSection方法访问web.config文件的connectionStrings节。
  • 如果文件没有被锁上,节可以使用默认的Windows加密方案进行加密。
  • 这些变化被保存在文件中。

等价的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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章