ASP.NET 使用受保护的配置加密配置信息
在以前的工作中,我们的总是会在Web.config配置中明文写出连接数据库的用户名和密码,最近在MSDN上发现有办法可以加密配置信息,在此贴出来希望使用的时候能有所帮助。
不用可读或容易解码的格式存储高度敏感的信息,这是保护应用程序的一个方面。敏感信息的示例包括用户名、密码、连接字符串和加密密钥。将敏感信息以不可读的格式存储,可以使攻击者很难获得对敏感信息的访问权限(即使攻击者获得了对文件、数据库或其他存储位置的访问权限),从而可以增强应用程序的安全性。
ASP.NET 应用程序中存储敏感信息的主要位置之一是 Web.config 文件。为了帮助保护配置文件中的信息,ASP.NET 提供了一项称为“受保护配置”的功能,可用于加密配置文件中的敏感信息。
可以使用受保护配置来加密 Web 应用程序配置文件(如 Web.config 文件)中的敏感信息(包括用户名和密码、数据库连接字符串和加密密钥)。对配置信息进行加密后,即使攻击者获取了对配置文件的访问,也可以使攻击者难以获取对敏感信息的访问,从而改进应用程序的安全性。
例如,未加密的配置文件中可能包含一个指定用于连接到数据库的连接字符串的节,如下面的示例所示:
<connectionStrings>
<add name="SampleSqlServer" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
</connectionStrings>
</configuration>
使用受保护配置对连接字符串值进行加密的配置文件不以明文形式显示连接字符串,而是以加密形式存储它们,如下面的示例所示:
<configuration> <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>RXO/zmmy3sR0iOJoF4ooxkFxwelVYpT0riwP2mYpR3FU+r6BPfvsqb384pohivkyNY7Dm4lPgR2bE9F7k6TblLVJFvnQu7p7d/yjnhzgHwWKMqb0M0t0Y8DOwogkDDXFxs1UxIhtknc+2a7UGtGh6Di3N572qxdfmGfQc7ZbwNE= </CipherValue> </CipherData> </EncryptedKey> </KeyInfo> <CipherData> <CipherValue>KMNKBuV9nOid8pUvdNLY5I8R7BaEGncjkwYgshW8ClKjrXSM7zeIRmAy/cTaniu8Rfk92KVkEK83+UlQd+GQ6pycO3eM8DTM5kCyLcEiJa5XUAQv4KITBNBN6fBXsWrGuEyUDWZYm6Eijl8DqRDb11i+StkBLlHPyyhbnCAsXdz5CaqVuG0obEy2xmnGQ6G3Mzr74j4ifxnyvRq7levA2sBR4lhE5M80Cd5yKEJktcPWZYM99TmyO3KYjtmRW/Ws/XO3z9z1b1KohE5Ok/YX1YV0+Uk4/yuZo0Bjk+rErG505YMfRVtxSJ4ee418ZMfp4vOaqzKrSkHPie3zIR7SuVUeYPFZbcV65BKCUlT4EtPLgi8CHu8bMBQkdWxOnQEIBeY+TerAee/SiBCrA8M/n9bpLlRJkUb+URiGLoaj+XHym//fmCclAcveKlba6vKrcbqhEjsnY2F522yaTHcc1+wXUWqif7rSIPhc0+MT1hB1SZjd8dmPgtZUyzcL51DoChy+hZ4vLzE= </CipherValue> </CipherData> </EncryptedData> </connectionStrings>
在对页进行请求时,.NET Framework 对连接字符串信息进行解密,并使其可供应用程序使用。
![]() |
---|
不能使用受保护配置来加密配置文件的 configProtectedData 节。也不能使用受保护配置来加密不使用节处理程序的配置节或者属于托管密码配置的节。下面是不能使用受保护配置进行加密的配置节的列表:processModel、runtime、mscorlib、startup、system.runtime.remoting、configProtectedData、satelliteassemblies、cryptographySettings、cryptoNameMapping 和 cryptoClasses。建议您使用其他方法(如 ASP.NET 设置注册表控制台应用程序 Aspnet_setreg.exe 工具)来加密敏感信息,以保护这些配置节中的敏感信息。有关 ASP.NET 设置注册表控制台应用程序 (Aspnet_setreg.exe) 的信息,请参见 Microsoft 知识库中的文章 Q329290“How to use the ASP.NET utility to encrypt credentials and session state connection strings”(如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串),知识库网址为 Microsoft 支持网站。 |
![]() |
---|
在将加密配置信息加载到应用程序使用的内存中时,会对这些信息进行解密。如果应用程序的内存受到安全威胁,则受保护配置节中的敏感信息可能也会受到安全威胁。 |
可以使用 ASP.NET IIS 注册工具 (Aspnet_regiis.exe) 或 System.Configuration 命名空间中的受保护配置类来管理受保护配置。
Aspnet_regiis.exe 工具(位于 %SystemRoot%\Microsoft.NET\Framework\versionNumber 文件夹中)中包括用于下列内容的选项:对 Web.config 文件的节进行加密和解密、创建或删除密钥容器、导出和导入密钥容器信息以及管理对密钥容器的访问。
通过使用 ProtectedConfigurationProvider 类可以对 Web.config 文件的内容进行加密和解密。下面的列表描述了包括在 .NET Framework 中的受保护配置提供程序:
-
DpapiProtectedConfigurationProvider.使用 Windows 数据保护 API (DPAPI) 对数据进行加密和解密。
-
RsaProtectedConfigurationProvider.使用 RSA 加密算法对数据进行加密和解密。
这两个提供程序都提供对数据的强加密;但是,如果您打算在多台服务器(如网络场)上使用同一个加密配置文件,则只有使用 RsaProtectedConfigurationProvider 才能导出用于对数据进行加密的加密密钥,并在另一台服务器上导入它们。
您可以通过在应用程序的 Web.config 文件中配置它来指定要使用哪个 ProtectedConfigurationProvider,也可以使用在 Machine.config 文件中配置的 ProtectedConfigurationProvider 实例之一。有关更多信息,请参见 指定受保护的配置提供程序。
在指定了要使用的提供程序之后,可以对应用程序的 Web.config 文件的内容进行加密或解密。有关更多信息,请参见 加密和解密配置节。
![]() |
---|
作为保护 Web 应用程序的最佳做法,您需要不断地更新应用程序服务器,安装最新的 Microsoft Windows 和 Internet 信息服务 (IIS) 安全修补程序以及 Microsoft SQL Server 或其他成员资格数据源的任何安全修补程序,这一点很重要。有关编写安全代码和保护应用程序安全的最佳做法的详细信息,请参见由 Michael Howard 和 David LeBlanc 编写的书籍 Writing Secure Code(《编写安全代码》)以及由 Microsoft Patterns and Practices(Microsoft 的模式与实践) 网站提供的指导。 |