现在的位置: 首页 > 综合 > 正文

关于webconfig的加密(RSAProtectedConfigurationProvider和DataProtectionConfigurationProvider)

2013年08月02日 ⁄ 综合 ⁄ 共 4307字 ⁄ 字号 评论关闭

DataProtectionConfigurationProvider

web.config 文件中经常会包含一些敏感信息,最常见的就是数据库连接字符串了,为了防止该信息泄漏,最好是将相关内容加密。

Aspnet_regiis.exe命令已经提供了加密配置文件的方法,系统默认提供两种加密方式:

DataProtectionConfigurationProvider
RSAProtectedConfigurationProvider
当然,如果有兴趣也可以编写自己的加密提供程序。

本文主要讲解如何利用DataProtectionConfigurationProvider来完成web.config的加解密

一 建立虚拟目录  http://localhost/EncryptWebConfig,并添加web.config,其中包含数据库连接字符串:

    <connectionStrings>
            <add name="Conn" connectionString="Data Source=liuwu;User ID=liuwu;Password=liuwu;"/>
    </connectionStrings>

二  运行 aspnet_regiis -pe "connectionStrings" -app "/EncryptWebConfig" -prov "DataProtectionConfigurationProvider"

aspnet_regiis 位于%WinDir%/Microsoft.NET/Framework/<versionNumber>目录下。
-pe 指定要加密的配置节,这里是 connectionStrings 。
-app 指定该配置文件所在的虚拟目录,这里是EncryptWebConfig。
-prov 指定要使用的提供程序,这里使用的是DataProtectionConfigurationProvider。
三  加密后连接字符串已经不可见了,可以看到如下形式的配置节

   <connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
       <EncryptedData>
         <CipherData>
           <CipherValue>AQAAANCMnd8BFdERjHoAw=</CipherValue>
         </CipherData>
       </EncryptedData>
    </connectionStrings>

四 如果要解密,则运行以下命令 aspnet_regiis -pd "connectionStrings" -app "/EncryptWebConfig"

-pd 指定要解密的配置节
-app 指定虚拟目录
五 如果不想建立虚拟目录,也可以指定配置文件的物理路径:aspnet_regiis.exe -pef "connectionStrings" d:/EncryptWebConfig -prov "DataProtectionConfigurationProvider"

-pef 指定要加密的配置节及配置文件的物理路径
六 解密使用 aspnet_regiis -pdf "connectionStrings" d:/EncryptWebConfig

-pdf 指定要解密的配置节及配置文件的物理路径

 

RSAProtectedConfigurationProvider

DataProtectedConfigurationProvider有一个缺陷,加密的文件只有在本机才能解密,如果有多台服务器的话,则需要每台机单独加密,因此不利于部署。

而利用RSAProtectedConfigurationProvider来加密就恰好可以解决这个问题。

本文就介绍一下如何利用RSAProtectedConfigurationProvider来部署多台服务器。

一 创建RSA 密钥

运行命令:aspnet_regiis -pc "LiuwuNetKeys" -exp

二 建立虚拟目录名称为EncryptWebConfig并添加Web.config文件如下:

 

<configProtectedData>
  <providers>
    <add
        keyContainerName="LiuwuNetKeys"
        useMachineContainer="true"
        description="Liuwu.net Keys"
        name="LiuwuNetProvider"
        type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</configProtectedData>
 
<connectionStrings>
  <add name="Conn" connectionString="Data Source=liuwu;User ID=liuwu;Password=liuwu;" />
</connectionStrings>主要是在config文件中加入configProtectedData配置节。

三 加密

运行命令aspnet_regiis -pe "connectionStrings" -app "/EncryptWebConfig" -prov "LiuwuNetProvider"

其中/EncryptWebConfig是虚拟目录的名称,LiuwuNetProvider 是上一步ConfigProtectedData配置节中配置的名称

加密后的连接字符串如下:

<connectionStrings configProtectionProvider="LiuwuNetProvider">
 <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>RoOicEmyEeyGt216zRdwRXVaBWB2rRn+znQN59Y9/U55dEWtYdY3/HnVzIzS/BTeJ6JMOkXWLXFSjSNrA8LY22ya65r8FBI8byOCEFJ5nd1sIpnCA4Fhm72JEKhojGXo1kMURCfSQd8BdHCAJskMrsG3/bGJconC8TyyfEXTgcM=</CipherValue>
        </CipherData>
      </EncryptedKey>
    </KeyInfo>
    <CipherData>
      <CipherValue>JTALo/rdj0zMzN2i0oFwP3wD6jQXijxpUjOc/5bBpOvP+dPQ2+rRDQXN5h+kzUWkB1vO4WSG9dDXif8Keud2QAJPU4eh4oc6pZ35sR6Ks/WzMqhnqPJi4GZ3yjodD+tuhgY2Cu94Q60R+IY4/DZ2iqrj4rNi51UCaFa7iF/CpOp6dMDkEu8ema0Asvfomj6R</CipherValue>
    </CipherData>
  </EncryptedData>
</connectionStrings>

四 分配权限

此时运行程序,可能会出现以下错误:

分析器错误消息: 未能使用提供程序“LiuwuNetProvider”进行解密。提供程序返回错误消息为: 打不开 RSA 密钥容器。

这是因为web服务器的运行帐号没有足够的权限来访问RSA容器,因此我们需要给他分配权限,在win2003的系统中,web服务器的运行帐号是NT Authority/Network Service,

运行命令:aspnet_regiis -pa "LiuwuNetKeys" "NT Authority/Network Service"

LiuwuNetKeys就是第一步创建的密钥名称

到现在程序可以正常运行了。

五 导出密钥

运行命令:aspnet_regiis -px "LiuwuNetKeys" "d:/LiuwuNetKeys.xml" -pri

LiuwuNetKeys 是第一步创建的密钥名称,这里将它导出为D盘的LiuwuNetKeys.xml文件

自此本机的操作已经完成,如果要解密,可以运行 aspnet_regiis -pd "connectionStrings" -app "/EncryptWebConfig"

六 部署到其他机器

在其他机器只要将加密后的Web.config文件拷贝过来,然后运行 aspnet_regiis -pi "LiuwuNetKeys" "d:/LiuwuNetKeys.xml" 就可以了,同样要记得分配权限。

注:这里只用了虚拟目录,其实也可以使用物理路径,具体参数可以在命令行运行 aspnet_regiis 查看具体的帮助。

转载地址:

http://www.liuwu.net/post/encrypt-web-config-file-1.aspx

http://www.liuwu.net/post/encrypt-web-config-file-2.aspx

抱歉!评论已关闭.