C#基础:.NET环境下WebConfig的加密

时间:2021-10-24 08:10:03

在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去。对于外网环境,则需要对Web.Config文件进行加密。

.NET环境下一共提供了2种方式的加密功能,分别是DpapiProtectedConfigurationProvider和RsaProtectedConfigurationProvider提供程序。

前者在本机加密Web.Config后,只能在本机进行解密,如果需要将Config文件复制到外部主机,则无法进行解密。后者在本机加密Config文件后,可以到处密钥容器,当把Config文件复制到外部主机后,可对先前导出的文件进行导入功能,导入后既可自动解密。

由于经常需要复制Config文件到外部主机,,因此Rsa保护程序更加适用于实际业务场景,本文将详细介绍RsaProtectedConfigurationProvider程序的使用步骤。

1. 使用RsaProvider提供程序,需要首先进入.NET Framework运行环境,可以配置环境变量或使用cd指令。

cd  C:\Windows\Microsoft.NET\Framework\v2.0.50727

2. 接着便可以使用aspnet_regiis.exe创建一个Rsa密钥容器。密钥容器分用户级别和计算机级别两种情况,由于使用用户级别密钥没什么益处,一般使用计算机级别既可。

aspnet_regiis -pc "MyKeys" -exp

3. 创建密钥容器后,还需要设置密钥容器的访问权限,下面的命令授予NETWORK SERVICE 帐户对计算机级别的 “MyKeys” RSA 密钥容器的访问权限。msdn上有一个aspx程序会展示你的asp.net程序的用户标志,不过本人实际执行pa指令后会报错。

aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"

4. 在Web.Config文件中加上如下配置节点,MyProvider为你的保护程序名称,可随意指定。keyContainerName为前面设置的密钥容器名称,useMachineContainer为true表示使用计算机级别密钥,为false表示使用使用用户级密钥。

这段配置节不要像msdn那样直接放在configure配置节点下面,这样会报错,建议放在你需要加密节点的后面。

<configProtectedData> <providers> <add type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" keyContainerName="MyKeys" useMachineContainer="true" /> </providers> </configProtectedData>

 5 .下面的指令将对指定路径下的config文件节点进行加密,如果配置文件中还有session的sql连接字符串,也可以对sessionState节点进行加密。

aspnet_regiis -pef "connectionStrings"  "D:\WebApp"  -prov   "MyProvider"

aspnet_regiis -pef "system.web/sessionState"  "D:\WebApp"  -prov   "MyProvider"

  加密后的connectionStrings节点如下所示,此时仍可访问ASP.NET应用程序。

<connectionStrings configProtectionProvider="MyProvider"> <EncryptedData Type="#Element" xmlns="#"> <EncryptionMethod Algorithm="#tripledes-cbc" /> <KeyInfo xmlns="#"> <EncryptedKey xmlns="#"> <EncryptionMethod Algorithm="#rsa-1_5" /> <KeyInfo xmlns="#"> <KeyName>Rsa Key</KeyName> </KeyInfo> <CipherData> <CipherValue>X3XoBfbo/h9QUeVUV8A1EGMM0NQuBnhfuC/iV1e7CCmGaiRt9ogmICenTK8VAmGfhufPzWFu5UUHSiO/6BIvYPEO5WoWlj3h5/sUQmRj6NsAJOnrnYHEjta4oQb4XajxazWcf3HUeWR0mG4wDCiUfTZaRIRmXkGgfbxewpsKJ5k=</CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>suqFgGjGFaon62YNI2VM5SQymcf4yyAku9fWQuvgClj1bfqixK9kIs9IE0I0m2u4gLbF+y0xPharfcOFJpXHDwHoaCrNQsxsutqiXquX67bYcJeYaMz5ja9ebqAtQvKIiZ/kHGvFIPXSCg5HiW/GGQwaf3FESVEsOaSAJZ3JJk9MlkkwDd6LepgtcCVjLnEK0lOeEFznrngizFFZWAsYjh5UCF5lNxNxf/IBwtznsfiFi2tV1F4sx9HkJEEryf5MEtu1RAA/wqarMvn7dlXhpGconpNPXA1IGlTmaZ/S1bR/FsO39skgHrs+OHsDMbJrI5ZO4TXXbK/DD86GPzu9JXrVKNVImzzW0V8aMc2HcVNClPsMwwgGaH6PNhE0xkjV6YH77XcLdVsKibvnwMlO/4kjGKoNXaSkFBoAEgprzi8=</CipherValue> </CipherData> </EncryptedData> </connectionStrings>

 如果需要解密,可以执行下面这条指令aspnet_regiis -pdf "connectionStrings" "D:\WebApp"

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-WebApp-20170622060005.mdf;Initial Catalog=aspnet-WebApp-20170622060005;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>

6. 导出密钥容器,密钥信息将被存储在导出的xml文件中,pri表示将公钥和私钥一起导出。

aspnet_regiis  -px "MyKeys" "D:/MyKeys.xml"  -pri

7.  有了这个xml文件,就相当于有了密钥容器,导出密钥容器后可以对密钥容器进行删除,删除指令如下。

aspnet_regiis  -pz  "MyKeys" 

8. 删除密钥容器后,如果前面你没有对Config文件进行解密,那么运行ASP.NET程序将会直接报错。