happyhippy

这个世界的问题在于聪明人充满疑惑,而傻子们坚信不疑。--罗素




http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/dnpag2crypto1.mspx?mfr=true
http://msdn2.microsoft.com/en-us/library/aa480457.aspx

只支持对称加密和Hash摘要。

1. 解决的问题:
    开发人员经常编写一些需要加密和哈希功能的应用程序,以满足其组织的安全性要求。通常需要加密由应用程序创建和维护的数据以及配置信息。另外,还需要对用于访问应用程序功能或数据的密码进行哈希运算。

    加密应用程序块通过将应用程序代码从特定的加密提供程序中抽象出来,从而简化了开发人员的工作。您可以通过更改配置来更改基础提供程序,而无需更改基础应用程序代码。它还可以封装与加密有关的常见难题(例如,加密和保留加密密钥)的最佳做法实现。

2. 使用
(0) 使用EntLib Configuration配置App.config/Web.config;
    项目中添加Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll引用;
    代码中引用命名空间using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
(1) Encrypt(支持DPAPI、AES、DES、3DES、RC2和自定义加密算法)

string plainText = "Source";
string symmProvider = "symmProvider";//EntLib Configuretion工具配置时设定的provider名字
string target = Cryptographer.EncryptSymmetric(symmProvider, plainText);

(2) Decrypt

string encryptedData = "×××××××××……";
string symmProvider = "symmProvider";//EntLib Configuretion工具配置时设定的provider名字
string plainText = Cryptographer.DecryptSymmetric(symmProvider, encryptedData);

(3) Hash(支持System.Security.Cryptography命名空间下的所有hash算法和自定义hash算法)

private const string hashProvider = "hashprovider";
private string plainText = "password";
byte[] valueToHash = Encoding.UTF8.GetBytes(plainText); 
private byte[] generatedHash = Cryptographer.CreateHash(hashProvider, valueToHash);

(4) 比较Hash是否与文本匹配

const string hashProvider = "hashprovider";
byte[] existingHashValue;
byte[] valueToHash = Encoding.UTF8.GetBytes("password");  
bool comparisonSucceeded = Cryptographer.CompareHash(hashProvider, valueToHash, existingHashValue);

 

3. Cryptography Application Block的设计:

 

4. 关于使用对称加密时,密钥的存放
    我们知道,对称加密中加密和解密要用到同一个密钥key;如果攻击者得到了Key,它就可以解密得到原始数据,因此加密后数据的安全性就落在了对Key的保密上。在使用.Net的System.Security.Cryptography命名空间下的AES、DES、3DES、RC2等加密算法时,EntLib配置工具会有个密钥文件生成向导,将密钥进行DPAPI(Data Protection API,DPAPI的加密密钥是根据当前登录到计算机的用户名和密码信息派生出来的,由操作系统进行管理,关于DPAPI的更多知识,恶意参考下面的第6节)对称加密后存在文件Key.Key中(如果文件被删,则会加/解密失败,配置文件中的<securityCryptographyConfiguration>定义了密钥文件在本地计算机上的绝对路径)。我们可以使用下面两种方式来保护Key的安全:
(1) 使用ACL将密钥文件只授权给合适的用户。(Protect your keys with access control lists (ACL). Only grant the necessary permissions to the identities that require access to the key file. )
(2) 不要在低信任环境中的计算机上配置远程调试。(Do not configure your computer to allow remote debugging when that computer runs in a low-trust environment. An example of such a computer is a Web server that allows anonymous access. )

5. 密钥的分发:
    不用计算机上的熵(entropy)值不同,所以当我们在一台计算机上加密,而要在另一台计算机上解密时,我们不能直接传送Key.Key文件,而只能使用EntLib配置工具:
(1) 导出密钥(Export Key)->输入密码(password);
(2) 配置工具会将Key.Key文件中的密钥进行DPAPI解密,再根据输入的密码组织成密钥进行加密,生成txt文件;
(3) 传输该txt文件;
(4) 另一台计算机上,使用EntLib创建加密Provider时,选择从txt文件中导入密钥,输入刚才加密用的密钥(password),EntLib会解密txt文件并进行DPAPI加密后存到本地计算机上。

    密钥分发太繁杂了,导来导去的,实际项目中:譬如一个服务器和N个客户端,每个客户端独占一个密钥,谁会这样分发密钥!感觉玩玩还行,适用价值不高...

6. 关于DPAPI(http://www.microsoft.com/china/technet/security/guidance/secmod21.mspx):
(1) Windows2000操作系统和更高版本的操作系统提供了用于加密和解密数据的Win32数据保护API(DPAPI);
(2) DPAPI是加密API(Crypto API)的一部分并且是在crypt32.dll中实现的。它包含两个方法:CryptProtectData和 CryptUnprotectData;
(3) DPAPI 特别有用,因为它能够消除使用密码的应用程序所带来的密钥管理问题。虽然加密能确保数据安全,但您必须采取额外的步骤来确保密钥的安全。DPAPI使用与DPAPI函数的调用代码关联的用户帐户的密码,以便派生加密密钥。因此,是操作系统(而非应用程序)管理着密钥。
(4) DPAPI 能够与计算机存储或用户存储(需要一个已加载的用户配置文件)配合使用。DPAPI 默认情况下用于用户存储,但您可以通过将 CRYPTPROTECT_LOCAL_MACHINE 标志传递给 DPAPI 函数来指定使用计算机存储。
(5) 这种用户配置文件方式提供了一个额外的安全层,因为它限制了哪些用户能访问机密内容。只有加密该数据的用户才能解密该数据。但是,当通过 ASP.NET Web 应用程序使用 DPAPI 时,使用用户配置文件需要您执行额外的开发工作,因为您需要采取明确的步骤来加载和卸载用户配置文件(ASP.NET 不会自动加载用户配置文件)。
(6) 计算机存储方式更容易开发,因为它不需要管理用户配置文件。但是,除非使用一个附加的熵参数,否则并不安全,因为该计算机的任何用户都可以解密数据。(熵是一个设计用来使解密机密内容更为困难的随机值)。使用附加的熵参数出现的问题在于它必须由应用程序安全地存储起来,这带来了另一个密钥管理问题。

注意:如果您将 DPAPI 和计算机存储一起使用,那么加密字符串仅适用于给定的计算机,因此您必须在每台计算机上生成加密数据。不要在场或群集中将加密数据从一台计算机复制到另一台计算机。

如果将 DPAPI 和用户存储一起使用,则可以用一个漫游的用户配置文件在任何一台计算机上解密数据。


有关对称加密和非对称加密的更多支持,可以参考我以前写的:http://www.cnblogs.com/happyhippy/category/79936.html


posted on 2007-08-15 08:58  Silent Void  阅读(690)  评论(0编辑  收藏  举报