许多 Web 应用程序都在数据库中以某种形式存储敏感数据。如果攻击者设法针对您的数据库执行查询,则务必要适当地加密所有敏感数据项(如信用卡号)。
•加密需要存储的敏感数据。
•确保网络上敏感数据的安全。
•使用带有salt 的哈希值存储密码。
加密需要存储的敏感数据
尽可能避免存储敏感数据。如果必须存储敏感数据,请对其进行加密。
使用 3DES 加密
要将敏感数据(如信用卡号)存储在数据库中,请使用强对称加密算法,如 3DES。
•在开发过程中,要启用 3DES 加密
1.使用 RNGCryptoServiceProvider 类来生成强(192 位,24 字节)加密密钥。
2.备份加密密钥,并将备份副本存储在物理安全的位置。
3.使用 DPAPI 对密钥进行加密,并将其存储在注册表项中。使用下面的 ACL 来确保注册表项的安全:
管理员:完全控制 进程帐户(例如,ASPNET):读取
•在运行时,要将加密数据存储在数据库中
1.获取要加密的数据。
2.从注册表中检索经过加密的加密密钥。
3.使用 DPAPI 对加密密钥进行解密。
4.结合使用 TripleDESCryptoServiceProvider 类和加密密钥来加密数据。
5.将加密数据存储在数据库中。
•在运行时,要对加密的机密进行解密
1.从数据库中检索加密数据。
2.从注册表中检索经过加密的加密密钥。
3.使用 DPAPI 对加密密钥进行解密。
4.使用 TripleDESCryptoServiceProvider 类对加密数据进行解密。
在此过程中,如果用来对加密密钥进行加密的 DPAPI 帐户被损坏,则可以从备份位置检索 3DES 密钥的备份,并在新帐户下使用 DPAPI 对该备份进行加密。新的加密密钥可以存储在注册表中,数据库中的数据仍可以进行解密。
有关创建托管 DPAPI 库的详细信息,请参阅“Microsoft patterns & practices Volume I, Building Secure ASP.NET Web Applications: Authentication, Authorization, and Secure Communication”中“How To”部分中的“How To: Create a DPAPI Library”,其网址为:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpMSDN.asp(英文)。
保护网络上敏感数据的安全
通过网络传入和传出数据库服务器的敏感数据可能包括应用程序特定的数据或数据库登录凭据。为了确保网络上的数据的私密性和完整性,可以使用平台级解决方案(如由安全数据中心提供的解决方案,在这种解决方案中,在服务器之间使用 IPSec 加密的通信通道),也可以对您的应用程序进行配置,以便与数据库建立 SSL 连接。后一种方法需要在数据库服务器上安装服务器证书。
有关使用 SSL 和 IPSec 的详细信息,请参阅“Microsoft patterns & practices Volume I, Building Secure ASP.NET Web Applications: Authentication, Authorization, and Secure Communication”的“How To”部分中的“How To: Use IPSec to Provide Secure Communication Between Two Servers”和“How To:Use SSL to Secure Communication to SQL Server 2000”,其网址为:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpMSDN.asp(英文)
使用带有salt 的哈希值存储密码
如果您需要实现一个包含用户名和密码的用户存储,请不要以明文或加密格式来存储密码。存储增加了 salt 的不可逆哈希值(而不是存储密码)可以降低词典攻击的风险。
注意 salt 值是密码形式的强随机数字。
创建 Salt 值
下面的代码显示了如何通过使用随机数字生成功能(此功能由 System.Security.Cryptography 命名空间中的 RNGCryptoServiceProvider 类提供)来生成 salt 值。
public static string CreateSalt(int size) { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] buff = new byte[size]; rng.GetBytes(buff); return Convert.ToBase64String(buff); }
创建 Hash 值(带有 Salt)
下面的代码片断显示了如何从所提供的密码和 salt 值生成哈希值。
public static string CreatePasswordHash(string pwd, string salt) { string saltAndPwd = string.Concat(pwd, salt); string hashedPwd = FormsAuthentication.HashPasswordForStoringInConfigFile( saltAndPwd, "SHA1"); return hashedPwd; }
详细信息
有关实现用户存储(使用带有salt 的哈希值存储密码)的详细信息,请参阅“Microsoft patterns & practices Volume I, Building Secure ASP.NET Web Applications: Authentication, Authorization, and Secure Communication”的“How To”部分中的“How To: Use Forms Authentication with SQL Server 2000”,其网址为:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpMSDN.asp(英文)。