澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站VS开垦顺序用户防备安全主

  一个开发的系统程序从需求、设计到打包、用户使用的过程中,安全问题一直是开发者关注的焦点。对于用户来说,不考虑加密工具(如加密精灵等),面对的是一个系统的各个组件集合及各类的配置文件( 如App.Config / Web.Config)。其中,涉及到安全防范问题如App.Config配置文件,里面会包含很多信息,包括最不想让用户知道的服务器地址、登录名和密码等,特殊的文件除外。本篇文章会展开两种方式来处理安全问题。

 

原创地址:

**一、 简介

最近在做一个WinForm的项目,由于采用的是在客户端直接连接数据库的方式,需要在客户端部署App.config,由于使用了Enterprise Library,需要对App.config文件里的connectionStrings片断进行加密处理,搜索MSDN,发现已经有了现成的工具ASP.NET IIS 注册工具 (Aspnet_regiis.exe),可是它只能针对ASP.NET的Web.config文件,难道我们就没有办法了吗?答案当然是否定的。

  (1)如果只是简单的防使用人员的话,那么你可以考虑在appsetting或其他的配置节中放加密后的连接字符串,然后在使用的地方先解密再使用,这里我介绍下DES加解密的方式(密匙为8位字节)。

ASP.NET web.config中,数据库连接字符串的加密与解密

转载请注明出处

**  当创建ASP.NET 2.0应用程序时,开发者通常都把敏感的配置信息存储在Web.config文件中。最典型的示例就是数据库连接字符串,但是包括在Web.config文件中的其它敏感信息还包括SMTP服务器连接信息和用户凭证数据,等等。尽管默认情况下可以配置ASP.NET以拒绝所有对扩展名为.config的文件资源的HTTP请求;但是,如果一个黑客能够存取你的web服务器的文件系统的话,那么,Web.config中的敏感信息仍然能够被窃取。例如,也许你不小心允许匿名FTP存取你的网站,这样以来就允许一个黑客简单地通过FTP协议下载你的Web.config文件。

配置选项

澳门新浦京娱乐场网站 1澳门新浦京娱乐场网站 2

 

在web.config或app.config文件里我们经常会存储一些敏感信息,比如connectionStrings或者appSettings,比如像下面的文件。

  幸好,通过允许加密Web.config文件中选择的部分,例如<connectionStrings>节,或你的应用程序使用的一些定制config节,ASP.NET 2.0有助于缓解这个问题。配置部分能够很容易地使用编码或aspnet_regiis.exe(一个命令行程序)预以加密。一旦被加密,Web.config设置即可避开"虎视眈眈"的眼睛。而且,当以编程方式从你的ASP.NET页面中检索加密的配置设置时,ASP.NET会自动地解密它读取的加密部分。简言之,一旦配置信息被加密,你就不需要在你的应用程序中编写任何其它代码或采取任何进一步的行为来使用该加密数据。

-pdf section webApplicationDirectory 对指定物理(非虚拟)目录中的 Web.config 文件的指定配置节进行解密。
-pef section webApplicationDirectory 对指定物理(非虚拟)目录中的 Web.config 文件的指定配置节进行加密。
 1 /// <summary> 
 2         /// DES加密,密钥为8位字符 
 3         /// </summary> 
 4         /// <param name="strEncrypt">需要加密的字符串</param> 
 5         /// <param name="strKey">8位的密钥</param> 
 6         /// <returns></returns> 
 7         public static string DesEncrypt(string strEncrypt, string strKey) 
 8         { 
 9             if (string.IsNullOrEmpty(strEncrypt)) return null; 
10             try 
11             { 
12                 DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
13                 byte[] inputByteArray = Encoding.Default.GetBytes(strEncrypt); 
14                 des.Key = ASCIIEncoding.ASCII.GetBytes(strKey); 
15                 des.IV = ASCIIEncoding.ASCII.GetBytes(strKey); 
16                 MemoryStream ms = new MemoryStream(); 
17                 CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); 
18                 cs.Write(inputByteArray, 0, inputByteArray.Length); 
19                 cs.FlushFinalBlock(); 
20                 StringBuilder ret = new StringBuilder(); 
21                 foreach (byte b in ms.ToArray()) 
22                 { 
23                     ret.AppendFormat("{0:X2}", b); 
24                 } 
25                 ret.ToString(); 
26                 return ret.ToString(); 
27             } 
28             catch 
29             { 
30                 return null; 
31             } 
32         } 

ASP.NET web.config中,数据库连接字符串的加密与解密。

<?xml version="1.0"?><configuration>    <system.web>      <compilation debug="true" targetFramework="4.0" />    </system.web>    <connectionStrings>      <add name="MyNwConnectionString" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername; Password=myPassword;"/>    </connectionStrings>    <appSettings>      <add key="User" value="myUsername"/>      <add key="Password" value="myPassword"/>    </appSettings></configuration>

using System;using System.Configuration;namespace WebConfigEncryptTest{    public partial class WebForm1 : System.Web.UI.Page    {        protected void Page_Load(object sender, EventArgs e)        {            string user = ConfigurationManager.AppSettings.Get("User");            string password = ConfigurationManager.AppSettings.Get("Password");            string connectionString = ConfigurationManager.ConnectionStrings["MyNwConnectionString"].ConnectionString;        }    }}

  在本文中,我们将讨论如何以编程方式加密和解密该配置设置部分,并且分析一下命令行程序aspnet_regiis.exe的使用。然后,我们将评估ASP.NET 2.0提供的加密选项。另外,还会简短地讨论一下如何加密ASP.NET版本1.x中的配置信息。

    -pdf 和-pef 参数是对指定的物理目录里的Web.config文件进行加密,我们可以先将App.config文件改名为Web.config,通过这两个参数便可以“骗”过系统,让它将指定的配置节进行加密,我们只需要将加密后的文件名改回App.config即可,我们来实验一下:

DES加密,密钥为8位字符

开始--->运行,输入cmd,接着输入以下内容

加密文件可以使用的Provider

.NET为我们提供了一个工具aspnet_regiis.exe来对web.config文件中的敏感信息进行加密(app.config文件可以先改名为web.config,加密后再改回app.config)。你可以使用两个provider中的一个来进行加密:

  • System.Configuration.DPAPIProtectedConfigurationProvider:在System.Configuration.dll中,使用Windows DPAPI(Data Protection API)来进行加密,密钥存在Windows Local Security Authority中。注意:当使用DPAPIProtectedConfigurationProvider时,加密文件所使用的帐号需要与运行web application的帐号相同,否则web application无法解密加密的内容。
  • System.Configuration.RSAProtectedConfigurationProvider:在System.Configuration.dll中,使用RSA算法来进行加密(RSA算法是非对称加密,参见《对称加密与非对称加密 》),公钥存放在config文件当中,只有加密的计算机有密钥。RSAProtectedConfigurationProvider通常是默认的缺省provider。

  二、 前提

    第一步:先将目录下的App.config改名为Web.config。

澳门新浦京娱乐场网站 3澳门新浦京娱乐场网站 4

加密:

加密文件的命令

加密web.config文件可以使用:

aspnet_regiis -pef section web-app-physical-dir

Encrypt the configuration section. Optional arguments:

[-prov provider] Use this provider to encrypt.

比如运行下面的命令就会分别对connectionStrings和appSettings中的信息进行加密:

aspnet_regiis.exe -pef "connectionStrings" "C:mywebHelloService"

aspnet_regiis.exe -pef "appSettings" "C:mywebHelloService"

澳门新浦京娱乐场网站 5

加密后的web.config文件变成:

<?xml version="1.0"?><configuration>    <system.web>      <compilation targetFramework="4.0" />    </system.web>    <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>E2fO9C0TJVxImLYQZza fCQdDbTpNh/kOKLRsK6zcFjkgtUCl6SnMViuu/2G1NVTxqXyEWYwyK6AiCZA feeG/AvYvmEEVopVDb0YyGeuJgEI1r8HxTl8Cv f2EIimP7LJI JRZVerI4MU6Ke3wxm2S/ATc73/W6eg9808f4/D6J0pp3wND4E79gBiAnBHFYQIefdJYUsmHR9z9LiIqjCllkkj/JB0kso0kGJ9i iew1Jae5jugIN8gPxsXbCfmw6ru3I3Kbpa8Z5AllfkFA2YKrsuV3c7eLLJ0kB4lsIJIUTy3kRyA4GjdChOmlNwwffIbhwUPPxa25CiF0VAq27Q==</CipherValue>                    </CipherData>                </EncryptedKey>            </KeyInfo>            <CipherData>                <CipherValue>I1DWG11Iz/rq NC9C/21B3Q22J9 IexHPH6kkWvQPeHUO6OvOWeQbk3wHALR2ql8pz0gQJFyfTypMk/xSSikFI2Dcy5mgYY3kP73bQQ83ho3O1HPw9TsRtK1G8gmVNGyQLj7iTRcoGfiYYmSibPynv1MzSV1qDXlnVfKiMqKRZ5ZPiMSMc5u3dDEL/JW1oCvAGs5tHrZU5 vgvm0yCmSuCWZbXva iv9J35EQqs58pq hwVo1hg1dffdupGCBykaXGl5VX3TIGc=</CipherValue>            </CipherData>        </EncryptedData>    </connectionStrings>    <appSettings 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>WVoFIs8rSEgqKw1C0QCmePs7WK6EIoGCfdx9CTJNmABoVvoEWPnOEQwz/6Ruu0rGwa7q91KuhGILmy4NEN0padnX6FScCdEzP6CS59U3IFumYmTrD7D9ihqFO2aIL/SuBvV3D2kxhHaYGFaPuvYgsyOLf3 aYR3O/uh/k5wZxLoIeKUUrT762J3bdaK6cJWQeuOu4j2vDXEdawdwhlnK12UV8 /AXZNlFW1N3Z0RUVFX1nMSwTaIu8F3tZ9hCFbGwbTm2T0XnfDOcB6dCxCutqC8pXD36laAfiSANzAWoC Yhf5eFSj24fX0NU6UTQB8fqLyOgWsIMLxZLKVrwnlmg==</CipherValue>                    </CipherData>                </EncryptedKey>            </KeyInfo>            <CipherData>                <CipherValue>5W2KhG/oETLUDptobcOM52x1qD/g9A0By/wcGXI fm7EdcD8mT3TxsLVBVcHRBCyUO7OIHl8NyCrduRSYwyd8ggBCriQ5KrbAmW4LXrNnw/JjjCEJWPuRcRucVRfpgap2nHh6BXRXC/AU6v0GcRqy7LV8179PgGtyAa8IE1mV/w=</CipherValue>            </CipherData>        </EncryptedData>    </appSettings></configuration>

RSAProtectedConfigurationProvider是默认的缺省provider,如果想使用DPAPIProtectedConfigurationProvider,可以用-prov参数指明:

aspnet_regiis.exe -pef "connectionStrings" "C:mywebHelloService" -prov "DataProtectionConfigurationProvider"

aspnet_regiis.exe -pef "appSettings" "C:mywebHelloService" -prov "DataProtectionConfigurationProvider"

加密配置文件后,源程序不需要做任何改动。如果要修改或添加新的配置信息,需要先解密配置文件。不论使用哪种Provider,都只能在进行加密的计算机上对配置文件进行解密。

  在我们开始探讨如何加密ASP.NET 2.0配置信息之前,请记住下列几点:

    第二步:打开SDK命令提示,输入命令:aspnet_regiis -pef "配置节" "目录",以我的项目为例,加密前的config文件内容如下:

 1 /// <summary> 
 2         /// DES解密,密钥为8为字符 
 3         /// </summary> 
 4         /// <param name="strDecrypt">需要加密的字符串</param> 
 5         /// <param name="strKey">8位的密钥</param> 
 6         /// <returns></returns> 
 7         public string DesDecrypt(string strDecrypt, string strKey) 
 8         { 
 9             if (string.IsNullOrEmpty(strDecrypt)) return null; 
10             try 
11             { 
12                 DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
13                 byte[] inputByteArray = new byte[strDecrypt.Length / 2]; 
14                 for (int x = 0; x < strDecrypt.Length / 2; x  ) 
15                 { 
16                     int i = (Convert.ToInt32(strDecrypt.Substring(x * 2, 2), 16)); 
17                     inputByteArray[x] = (byte)i; 
18                 } 
19                 des.Key = ASCIIEncoding.ASCII.GetBytes(strKey); 
20                 des.IV = ASCIIEncoding.ASCII.GetBytes(strKey); 
21                 MemoryStream ms = new MemoryStream(); 
22                 CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); 
23                 cs.Write(inputByteArray, 0, inputByteArray.Length); 
24                 cs.FlushFinalBlock(); 
25                 return System.Text.Encoding.Default.GetString(ms.ToArray()); 
26             } 
27             catch 
28             { 
29                 return null; 
30             } 
31         } 

C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_regiis.exe -pef "connectionStrings" "你的Web项目路径"

解密文件的命令

解密的命令如下(解密命令不需要-prov参数):

-pdf section web-app-physical-dir

Decrypt the configuration section.

aspnet_regiis.exe -pdf "connectionStrings" "C:mywebHelloService"

aspnet_regiis.exe -pdf "appSettings" "C:mywebHelloService"

澳门新浦京娱乐场网站 6

  1. 所有形式的加密都会包含某种秘密,而当加密和解密数据时都要使用这一秘密。对称加密算法在加密和解密一个消息时使用同一把密钥,而非对称加密算法对于加密和解密却使用不同的密钥。无论使用哪种技术,最重要的还是看解密密钥的安全保存程度。

 1澳门新浦京娱乐场网站 7<?xml version="1.0" encoding="utf-8"?>
 2澳门新浦京娱乐场网站 8<configuration>
 3澳门新浦京娱乐场网站 9  <configSections>
 4澳门新浦京娱乐场网站 10    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
 5澳门新浦京娱乐场网站 11  </configSections>
 6澳门新浦京娱乐场网站 12  <dataConfiguration defaultDatabase="Connection String" />
 7澳门新浦京娱乐场网站 13  <connectionStrings>
 8澳门新浦京娱乐场网站 14    <add name="Connection String" connectionString="Database=LocomotiveStat;Server=10.167.61.49;User ID=sa;Password=sa;"
 9澳门新浦京娱乐场网站 15      providerName="System.Data.SqlClient" />
10澳门新浦京娱乐场网站 16  </connectionStrings>
11澳门新浦京娱乐场网站 17</configuration>

DES解密,密钥为8为字符

解密:

总结

配置文件中经常会有用户名密码的敏感信息,为了防止该信息泄露,需要对配置文件进行加密。加密与解密可以使用.NET提供的工具aspnet_regiis.exe,可以在Windows .NET的文件夹中找到它。

该工具只对web.config文件进行修改,如果要加密或解密app.config,可以先将app.config文件改名为web.config,加密或解密后再改回来。

  2. ASP.NET 2.0提供的配置加密技术的设计目的在于,力图阻止能够以某种方式检索你的配置文件的黑客的入侵。其实现思想是,如果在黑客的计算机上有你的Web.config文件;那么,他不能破解该加密的部分。然而,当web服务器上的一个ASP.NET页面从一个加密的配置文件请求信息时,该数据必须被解密才能使用(并且这时不需要你编写任何代码)。因此,如果一个黑客能够把一个能够查询配置文件并显示它的结果的ASP.NET web页面上传到你的系统,那么,他就能够以普通文本方式观看被加密的设置。(详细情况请参考本文提供的示例ASP.NET页面,它展示了加密和解密Web.config文件中各部分的方法;如你所见,一个ASP.NET页面能够存取(并显示)该加密数据的普通文本形式)

    输入命令:aspnet_regiis -pef "connectionStrings" "E:开发目录",加密后的config文件内容如下:

关于DES加解密的密匙的获取,一般是内部人员掌控,可访问服务器获取,安全上更有保障。

C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_regiis.exe -pdf "connectionStrings" "你的Web项目路径"

  3. 加密和解密配置信息需要付出一定的性能代价。因此,通常是仅加密包含敏感信息的配置部分。比如说,可能不需要加密<compilation>或<authorization>配置部分。

 1澳门新浦京娱乐场网站 18<?xml version="1.0" encoding="utf-8"?>
 2澳门新浦京娱乐场网站 19<configuration>
 3澳门新浦京娱乐场网站 20  <configSections>
 4澳门新浦京娱乐场网站 21    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
 5澳门新浦京娱乐场网站 22  </configSections>
 6澳门新浦京娱乐场网站 23  <dataConfiguration defaultDatabase="Connection String" />
 7澳门新浦京娱乐场网站 24  <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
 8澳门新浦京娱乐场网站 25    <EncryptedData Type=""
 9澳门新浦京娱乐场网站 26      xmlns=";
10澳门新浦京娱乐场网站 27      <EncryptionMethod Algorithm="" />
11澳门新浦京娱乐场网站 28      <KeyInfo xmlns=";
12澳门新浦京娱乐场网站 29        <EncryptedKey xmlns=";
13澳门新浦京娱乐场网站 30          <EncryptionMethod Algorithm="" />
14澳门新浦京娱乐场网站 31          <KeyInfo xmlns=";
15澳门新浦京娱乐场网站 32            <KeyName>Rsa Key</KeyName>
16澳门新浦京娱乐场网站 33          </KeyInfo>
17澳门新浦京娱乐场网站 34          <CipherData>
18澳门新浦京娱乐场网站 35            <CipherValue>g2QFQqbHU1L6WUPYqjADqFAvHcdq/7dqCd1U9GlQFEi/nHDVHjqsWvjNywOZtQQg7Q/yW7g8xlRCo0h2 yYd/tQTNoVMu/RKdJmSjZMnmnwpWq S2VEWK4U106JQwLCfBR/bAF4DHvG47B9KB0JbRfXBt5V2wJVaAI9u3kzuj50=</CipherValue>
19澳门新浦京娱乐场网站 36          </CipherData>
20澳门新浦京娱乐场网站 37        </EncryptedKey>
21澳门新浦京娱乐场网站 38      </KeyInfo>
22澳门新浦京娱乐场网站 39      <CipherData>
23澳门新浦京娱乐场网站 40        <CipherValue>blwV/ZW1izFZL80YL5RkcjrIjWkQ0L1gJhgZbxEzzTgOcT24ihrAnv3/rDCG WIZ7TL5D/rMm7dQwkIsij1Sh3befg6F3 pxcW4oe1w/bovIKuzjs3tokUpBvTTj fsCs2W/MWUhQaWMKQWkHfS2Ajt6gL6MTYtb3pfQUp0pdHbeRxoqdiAksQ1Zzsi1FtRTi7gTT7hnpF0pJs W9mxTVDMO/qSZXfXLOEMIs/A5ExcfvR5GjpaPuDeLuSsCN3XtjaiXzaDQ3It7j r66 L2C0xvEhbT9SsG</CipherValue>
24澳门新浦京娱乐场网站 41      </CipherData>
25澳门新浦京娱乐场网站 42    </EncryptedData>
26澳门新浦京娱乐场网站 43  </connectionStrings>
27澳门新浦京娱乐场网站 44</configuration>

那么有了上面加密后的一堆数据,如何更改对应配置文件中的某个配置节上的数据,微软提供System.Configuration.dll组件来操作App.Config配置文件等数据将其处理,如:

.NET为版本的路径自行修改,其中connectionStrings连接字符串的名称。(版本和自己的配置相关联)
connectionStrings>
<add name="Conn" connectionString="server=. ;database=UserDB;integrated security=sspi" />
</connectionStrings>

  三、 加密何种信息

    由此可见,我们已经完成了任务,现在只需要将Web.config文件名改回App.config即可,在应用程序项目中无需对该文件进行解密操作,.NET框架会自动替我们完成,如果想解密该文件也很简单,在SDK命令提示里输入aspnet_regiis -pdf "配置节" "目录"即可。

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["配置节"].Value = strDesEncrypt;//DES加密后的数据
config.Save();

1.在Dos命令窗口中执行命令:

  在我们分析如何加密ASP.NET 2.0配置信息前,让我们首先来看一下能够加密什么配置信息。使用.NET框架2.0提供的库,开发人员能够加密在Web.config或machine.config文件中的绝大多数的配置部分。这些配置部分是一些作为<configuration>或<system.web>元素子结点的XML元素。例如,下面的示例Web.config文件中含有三个配置设置,显式地定义为:

 缺点:安全性低,局限于非计算机操作者,对于一个业务繁琐的系统不切实际。

C:Documents and SettingsAdministrator>C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_regiis -pef "connectionStrings" "E:sjzbWebSite1"
2.命令成功完成以后会在C:Documents and SettingsAll UsersApplication DataMicrosoftCryptoRSAMachineKeys 中生成一个密钥文件.该文件在不同的机器上是不一样的.在该文件上点右键,选属性,在安全属性页上,将NETWORK_SERVICE组添加进去,给读取权限.

<connectionStrings>,<compilation>和<authentication>。
<?xml version="1.0"?>
<configuration xmlns="
<connectionStrings>
 <add name="MembershipConnectionString" connectionString="connectionString"/>
</connectionStrings>
<system.web>
 <compilation debug="true"/>
 <authentication mode="Forms" />
</system.web>
  这些节中的每一个都可以有选择地被加密,或者通过编程方式或通过aspnet_regiis.exe(一个命令行工具)实现。当被加密时,加密后的文本直接存储在配置文件中。例如,如果我们要加密上面的<connectionStrings>节,那么结果Web.config文件可能看起来如下所示:(注意:篇幅所限,我们省略了一大块<CipherValue>)

   提供参考网站:

3.如果连接字符串中的用户名和口令需要修改,则用下面的命令将webconfig文件解密.然后重复上面的加密步骤即可

<?xml version="1.0"?>
<configuration xmlns="
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
 <CipherData>
  <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl sBAAAAed...GicAlQ==</CipherValue>
 </CipherData>
</EncryptedData>
</connectionStrings>
<system.web>
 <compilation debug="true"/>
 <authentication mode="Forms" />
</system.web>
  另外,存在一些你不能使用这个技术加密的配置部分:

  (2) 默认情况下,我们需要对App.config文件里的connectionStrings或其他配置节片断进行加密处理,ASP.NET IIS 注册工具 (Aspnet_regiis.exe)可以胜任这个工作,但这个工具只能针对ASP.NET的Web.config文件,难道我们就没有办法了吗?答案当然是否定的。

C:Documents and SettingsAdministrator>C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_regiis -pdf "connectionStrings" "E:sjzbWebSite1"

  · <processModel>
  · <runtime>
  · <mscorlib>
  · <startup>
  · <system.runtime.remoting>
  · <configProtectedData>
  · <satelliteassemblies>
  · <cryptographySettings>
  · <cryptoNameMapping>
  · <cryptoClasses>

  配置选项:

本文来自CSDN博客,转载请标明出处:

  为了加密这些配置部分,你必须加密这些值并把它存储在注册表中。存在一个aspnet_setreg.exe命令行工具可以帮助你实现这一过程;我们将在本文后面讨论这个工具。

-pdf section webApplicationDirectory 对指定物理(非虚拟)目录中的 Web.config 文件的指定配置节进行解密。

在代码中验证是否已经j加密:

  【提示】Web.Config和Machine.Config之区别:

-pef section webApplicationDirectory 对指定物理(非虚拟)目录中的 Web.config 文件的指定配置节进行加密。

Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

  Web.config文件指定针对一个特定的web应用程序的配置设置,并且位于应用程序的根目录下;而machine.config文件指定所有的位于该web服务器上的站点的配置设置,并且位于$WINDOWSDIR$Microsoft.NetFrameworkVersionCONFIG目录下。

-pdf 和-pef 参数是对指定的物理目录里的Web.config文件进行加密,我们可以先将App.config文件改名为Web.config,通过这两个参数便可以“骗”过系统,让它将指定的配置节  进行加密,我们只需要将加密后的文件名改回App.config即可,我们来实验一下:

ConfigurationSection configSection = config.GetSection("connectionStrings");

  四、加密选项

 第一步:先将目录下的App.config改名为Web.config。

if (configSection.SectionInformation.IsProtected)

  开发人员可以使用ASP.NET 2.0提供程序模型来保护配置节信息,这允许任何实现都可以被无缝地插入到该API中。.NET框架2.0中提供了两个内置的提供程序用于保护配置节信息:

 第二步:打开SDK命令提示,输入命令:aspnet_regiis -pef "配置节" "目录",以我的项目为例,加密前的config文件内容如下:

...{//如果已经加密,就不用再加密了

  · Windows数据保护API(DPAPI)提供程序(DataProtectionConfigurationProvider):这个提供程序使用Windows内置的密码学技术来加解密配置节。默认情况下,这个提供程序使用本机的密钥。你还能够使用用户密钥,但是这要求进行一点定制。

  

configSection.SectionInformation.UnprotectSection();

  · RSA保护的配置提供程序(RSAProtectedConfigurationProvider):使用RSA公钥加密来加解密配置节。使用这个提供程序,你需要创建存储用于加解密配置信息的公钥和私钥的密钥容器。你能够在一个多服务器场所下使用RSA,这只要创建可输出的密钥容器即可。
当然,如果需要的话,你还能够创建自己的保护设置提供程序。

1<?xml version="1.0" encoding="utf-8"?>
 2<configuration>
 3  <configSections>
 4    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
 5  </configSections>
 6  <dataConfiguration defaultDatabase="Connection String" />
 7  <connectionStrings>
 8    <add name="Connection String" connectionString="Database=LocomotiveStat;Server=10.167.61.49;User ID=sa;Password=sa;"
 9      providerName="System.Data.SqlClient" />
10  </connectionStrings>
11</configuration>

config.Save();

  在本文中,我们仅讨论使用DPAPI提供程序使用机器级密钥。到目前为止,这是最简单的方法,因为它不请求创建任何密钥或密钥容器。当然,其消极的一面在于:一个加密的配置文件仅能够用于首先实现加密的web服务器上;而且,使用机器密钥将允许加密的文本能够被web服务器上的任何网站所解密。

输入命令:aspnet_regiis -pef "你要加密的【配置节】" "你要加密的【目录】",加密后的config文件内容如下:

}

  五、以编程方式加密配置部分

1<?xml version="1.0" encoding="utf-8"?>
 2<configuration>
 3  <configSections>
 4    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
 5  </configSections>
 6  <dataConfiguration defaultDatabase="Connection String" />
 7  <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
 8    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
 9      xmlns="http://www.w3.org/2001/04/xmlenc#">
10      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
11      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
12        <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
13          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
14          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
15            <KeyName>Rsa Key</KeyName>
16          </KeyInfo>
17          <CipherData>
18            
<CipherValue>g2QFQqbHU1L6WUPYqjADqFAvHcdq/7dqCd1U9GlQFEi/nHDVHjqsWvjNywOZtQQg7Q/yW7g8xlRCo0h2 yYd/tQTNoVMu/RKdJmSjZMnmnwpWq S2VEWK4U106JQwLCfBR/bAF4DHvG47B9KB0JbRfXBt5V2wJVaAI9u3kzuj50=</CipherValue>
19          </CipherData>
20        </EncryptedKey>
21      </KeyInfo>
22      <CipherData>
23        
<CipherValue>blwV/ZW1izFZL80YL5RkcjrIjWkQ0L1gJhgZbxEzzTgOcT24ihrAnv3/rDCG WIZ7TL5D/rMm7dQwkIsij1Sh3befg6F3 pxcW4oe1w/bovIKuzjs3tokUpBvTTj fsCs2W/MWUhQaWMKQWkHfS2Ajt6gL6MTYtb3pfQUp0pdHbeRxoqdiAksQ1Zzsi1FtRTi7gTT7hnpF0pJs W9mxTVDMO/qSZXfXLOEMIs/A5ExcfvR5GjpaPuDeLuSsCN3XtjaiXzaDQ3It7j r66 L2C0xvEhbT9SsG</CipherValue>
24      </CipherData>
25    </EncryptedData>
26  </connectionStrings>
27</configuration>

else

  System.Configuration.SectionInformation类对一个配置节的描述进行了抽象。为了加密一个配置节,只需要简单地使用SectionInformation类的ProtectSection(提供程序)方法,传递你想使用的提供程序的名字来执行加密。为了存取你的应用程序的Web.config文件中的一个特定的配置节,你可以使用WebConfigurationManager类(在System.Web.Configuration命名空间中)来引用你的Web.config文件,然后使用它的GetSection(sectionName)方法返回一个ConfigurationSection实例。最后,你可以经由ConfigurationSection实例的SectionInformation属性得到一个SectionInformation对象。

  自己也随便找了个配置文件式下了,成功了。

...{

  下面,我们通过一个简单的代码示例来说明问题:

澳门新浦京娱乐场网站 45

configSection.SectionInformation.ProtectSection ("DataProtectionConfigurationProvider");

privatevoid ProtectSection(string sectionName, string provider)
{
 Configuration config = WebConfigurationManager.
 OpenWebConfiguration(Request.ApplicationPath);
 ConfigurationSection section = config.GetSection(sectionName);
 if (section != null &&!section.SectionInformation.IsProtected)
 {
  section.SectionInformation.ProtectSection(provider);
  config.Save();
 }
}
澳门新浦京娱乐场网站VS开垦顺序用户防备安全主题素材,config数据库连接字符串加密。private void UnProtectSection(string sectionName) {
 Configuration config =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
 ConfigurationSection section = config.GetSectio n(sectionName);
 if (section != null && section.SectionInformation.IsProtected)
 {
  section.SectionInformation.UnprotectSection();
  config.Save();
 }
  你可以从一个ASP.NET页面中调用这个ProtectSection(sectionName,provider)方法,其相应的参数是一个节名(如connectionStrings)和一个提供程序(如DataProtectionConfigurationProvider),并且它打开Web.config文件,引用该节,调用SectionInformation对象的ProtectSection(provider)方法,最后保存配置变化。

 

config.Save();

  另一方面,UnProtectSection(provider)方法实现解密一个特定的配置节。在此,仅需要传入要解密的节-我们不需要麻烦提供程序,因为该信息已经存储在伴随encrypted节的标记中(也即是,在上面的示例中的<connectionStrings>节,在被加密以后,它包含了提供程序:<connectionStringsconfigProtectionProvider="DataProtectionConfigurationProvider">)。

 澳门新浦京娱乐场网站 46

}

  记住,一旦该数据被加密,当从一个ASP.NET页面读取它时(也即是,从一个SqlDataSource控件或以编程方式经由ConfigurationManager.ConnectionStrings[connStringName].ConnectionString读取该连接字符串信息),ASP.NET会自动地解密该连接字符串并且返回普通文本值。换句话说,在实现加密后,你一点不需要改变你的代码。相当酷,对不对?

由此可见,我们已经完成了任务,现在只需要将App.config文件名改回Web.config即可,在应用程序项目中无需对该文件进行解密操作,.NET框架会自动替我们完成,如果想解密该文件也很简单,在SDK命令提示里输入aspnet_澳门新浦京娱乐场网站VS开垦顺序用户防备安全主题素材,config数据库连接字符串加密。regiis -pdf "配置节" "目录"即可。

 

  从本文下载的示例ASP.NET 2.0网站中,你会发现有一个示例页面,它展示了该站点的Web.config文件,其中有一个多行TextBox,还提供了相应的Web控件按钮用于加密配置文件的各个部分。这个示例中也使用了上面已经讨论过的ProtectSection()和UnProtectSection()方法。

  参考网址如:

加密后解密出现找不到迷失错误!

  六、 使用命令行工具aspnet_regiis.exe

  希望本篇文章对大家有一定的帮助,以上有不足之处,或有其他更合理的方法请留言赐教。

我们如果想对web.config的数据库连接字符串进行加密的话,那么这里提供了两个方法。

  你还能够使用aspnet_regiis.exe命令行工具来加密和解密Web.config文件配置部分,你可以在"%WINDOWSDIR%Microsoft.NetFrameworkversion"目录下找到这个工具。为了加密Web.config文件中的一个节,你可以在这个命令行工具中使用DPAPI机器密钥,如下所示:

  A young ilder ~ An old baggar !

方法一、
  使用“DataProtectionConfigurationProvider”形式加密,创建test.aspx文件,代码如下:
 需要添加引用
 using System.Web.Configuration;
 using System.IO;

  加密一个特定网站的Web.config文件的通用形式:

 //加密
 protected void Button1_Click(object sender, EventArgs e)
  {
  Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
  ConfigurationSection section = config.GetSection("connectionStrings");
   
  if (section != null && !section.SectionInformation.IsProtected)
  {
  section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
  config.Save();
  }

aspnet_regiis.exe -pef section physical_directory -prov provider
  或:

  }
 //解密
  protected void Button2_Click(object sender, EventArgs e)
  {
  Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
  ConfigurationSection section = config.GetSection("connectionStrings");

aspnet_regiis.exe -pe section -app virtual_directory -prov provider
  加密一个特定网站的Web.config文件的具体实例:

  if (section != null && section.SectionInformation.IsProtected)
  {
  section.SectionInformation.UnprotectSection();
  config.Save();
  }
  }

aspnet_regiis.exe -pef "connectionStrings" "C:InetpubwwwrootMySite" -prov "DataProtectionConfigurationProvider"
  或:

总结:此方法很方便,并且很简单,但安全性没有密钥加密高。

aspnet_regiis.exe -pe "connectionStrings" -app "/MySite" -prov "DataProtectionConfigurationProvider"
  解密一个特定网站的Web.config文件的通用形式:

方法二、
 使用“RSAProtectedConfigurationProvider”形式来加密
 test.aspx程序文件基本如上,
 把
 section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
 改成
 section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
 但这个时候你访问网站的时候很有可能会出现

aspnet_regiis.exe -pdf section physical_directory
  或:

 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。 
 分析器错误信息: 未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。
 
 这样的错误,解决方法是:
 进dos运行:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITYNETWORK SERVICE"
  如果运行出错,需要把目录 C:WINDOWSMicrosoft.NETFrameworkv2.0.50727 放入环境变量path中。
  此时就可以成功访问网站了。
  同样可以通过命令行来实现“RSAProtectedConfigurationProvider”加密
  
  注意:你也可以不运行 aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITYNETWORK SERVICE"命令来注册默认的 RsaProtectedConfigurationProvider 的RSA 密钥容器
  方法如下:
  1)创建一个可导出的rsa密钥容器,命名为Key

aspnet_regiis.exe -pd section -app virtual_directory 
  解密一个特定网站的Web.config文件的具体实例:

aspnet_regiis -pc "Key" -exp

aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
  或:

2)在你要加密的信息前面指定密钥容器,如:

  你还能够指定由aspnet_regiis.exe来执行machine.config文件的加密/解密。

<configProtectedData> 

  【提示】 加密ASP.NET版本1.x中的配置设置

  <providers> 

  为了保护ASP.NET版本1.x中的配置设置,开发者需要加密并把敏感的设置存储在web服务器的注册表中,并以一种"强"键方式存储。配置文件中不是存储加密的内容(如ASP.NET 2.0那样),而只是包含一个到存储该加密值的注册表键的引用。例如:

  <clear /> 

<identity impersonate="true"
userName="registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,userName"
password="registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,password" />
  微软为开发人员提供了aspnet_setreg.exe命令行工具,用于加密敏感的配置信息并且把它移动到一个"强"注册表入口处。遗憾的是,这个工具仅针对特定的配置设置工作;相比之下,ASP.NET 2.0允许加密任何配置节。

  <add name="KeyProvider" 

  有关于在一个ASP.NET 1.x应用程序中使用aspnet_setreg.exe的更多信息请参考MSDN中的KB#32990。遗憾的是,这个命令行程序仅能加密配置设置中的预定义的节,并且不允许你加密你自己添加的数据库连接字符串和其它敏感信息。

      type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 

  七、 结论

      keyContainerName="Key" 

  在本文中,我们学习了如何使用ASP.NET 2.0提供的不同的加密选项来保护配置节信息,还讨论了如何使用编程技术和aspnet_regiis.exe来分别加密Web.config中的配置节。保护你的敏感的配置设置有助于确保你的站点更难于被黑客攻击-通过使其更难于发现敏感的配置设置。如今,ASP.NET 2.0已经提供了相对容易的加密和解密技术,开发者毫无理由不使用这种方式来保护你的敏感的配置设置。

      useMachineContainer="true"/> 

  </providers> 

</configProtectedData> 

<connectionStrings> 

  <add name="SQLConnString" connectionString="Data Source=yourIP;Initial Catalog=test;User Id=yourID;Password=yourPassword;" 

  providerName="System.Data.SqlClient" /> 

</connectionStrings>

并且确保在configuration节的xmlns属性有如下值:

<configuration xmlns=";

3)对配置文件进行加密

aspnet_regiis -pef "connectionStrings" "E:projectTest" -prov "KeyProvider"

参数分别为:需要加密的配置节、项目所在目录的物理路径、加密所使用的密钥容器名称

再看web.config文件,就会发现connectionStrings节已经被加密了,但是运行程序会发现程序仍然可以正确访问数据库。

此时,只需运行:

aspnet_regiis -pdf "connectionStrings" "E:projectTest"

就可以对web.config文件进行解密。

(注意,如果还是有错误,那可能是您没有给生成的密匙文件足够的权限,去到 C:Documents and SettingsAll UsersApplication DataMicrosoftCryptoRSAMachineKeys 目录下,
  找到刚生成的密匙文件,把network service用户的读取权限赋予给它,就可以了,直接用命令的话也可以:命令如下 aspnet_regiis -pa "Key" "NT AUTHORITYNETWORK SERVICE" ,可能需要重新启动iis)

4)把密钥容器导出为xml文件

aspnet_regiis -px "Key" "e:Key.xml"

这个命令只导出公钥,因此以后只能用于加密,而无法解密。

aspnet_regiis -px "Key" "e:Keys.xml" -pri

这个则连私钥一起导出了,所以我们要用这个。

5)把密钥容器删除

aspnet_regiis -pz "Key"

删除后再运行程序,会提示出错:

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

同理可以证明,在任何一台未安装正确的密钥容器Key的机器上,程序都无法对connectionStrings节进行解密,因此也就无法正常运行。

6)导入key.xml文件

aspnet_regiis -pi "Key" "e:Keys.xml"

此时,再运行程序会发现又可以解密了。证明加密与解密机制运行正常。

最后说一下这个机制所提供的安全性保障可以运用在什么方面:

对winform程序的app.config进行加密实际意义并不大,因为无论如何,客户机都可以通过运行aspnet_regiis -pdf 来对配置文件进行解密,从而暴露敏感信息。

对于web.config进行加密的意义也仅限于,当web.config文件不小心泄露时,不会同时泄露敏感信息,如果恶意攻击者已经取得了在服务器上运行程序的权限,那么同app.config一样,可以很容易通过通过运行aspnet_regiis -pdf 获取明文了。

还有,通过aspnet_regiis -pa "Key" "NT AUTHORITYNETWORK SERVICE"控制对不同用户对密钥容器的访问权限,应该还可以进一步获取一些安全性,比如可以控制某些用户即使登录到服务器上,也无法用aspnet_regiis -pdf对配置文件进行解密。

引用地址:

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站VS开垦顺序用户防备安全主