http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/dnpag2crypto1.mspx?mfr=true
http://msdn2.microsoft.com/en-us/library/aa480457.aspx
只支持對稱加密和Hash摘要。
1. 解決的問題:
開發(fā)人員經(jīng)常編寫一些需要加密和哈希功能的應(yīng)用程序,以滿足其組織的安全性要求。通常需要加密由應(yīng)用程序創(chuàng)建和維護的數(shù)據(jù)以及配置信息。另外,還需要對用于訪問應(yīng)用程序功能或數(shù)據(jù)的密碼進行哈希運算。
加密應(yīng)用程序塊通過將應(yīng)用程序代碼從特定的加密提供程序中抽象出來,從而簡化了開發(fā)人員的工作。您可以通過更改配置來更改基礎(chǔ)提供程序,而無需更改基礎(chǔ)應(yīng)用程序代碼。它還可以封裝與加密有關(guān)的常見難題(例如,加密和保留加密密鑰)的最佳做法實現(xiàn)。
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工具配置時設(shè)定的provider名字
string target = Cryptographer.EncryptSymmetric(symmProvider, plainText);(2) Decrypt
string encryptedData = "×××××××××……";
string symmProvider = "symmProvider";//EntLib Configuretion工具配置時設(shè)定的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的設(shè)計:
4. 關(guān)于使用對稱加密時,密鑰的存放
我們知道,對稱加密中加密和解密要用到同一個密鑰key;如果攻擊者得到了Key,它就可以解密得到原始數(shù)據(jù),因此加密后數(shù)據(jù)的安全性就落在了對Key的保密上。在使用.Net的System.Security.Cryptography命名空間下的AES、DES、3DES、RC2等加密算法時,EntLib配置工具會有個密鑰文件生成向?qū)В瑢⒚荑€進行DPAPI(Data Protection API,DPAPI的加密密鑰是根據(jù)當(dāng)前登錄到計算機的用戶名和密碼信息派生出來的,由操作系統(tǒng)進行管理,關(guān)于DPAPI的更多知識,惡意參考下面的第6節(jié))對稱加密后存在文件Key.Key中(如果文件被刪,則會加/解密失敗,配置文件中的<securityCryptographyConfiguration>定義了密鑰文件在本地計算機上的絕對路徑)。我們可以使用下面兩種方式來保護Key的安全:
(1) 使用ACL將密鑰文件只授權(quán)給合適的用戶。(Protect your keys with access control lists (ACL). Only grant the necessary permissions to the identities that require access to the key file. )
(2) 不要在低信任環(huán)境中的計算機上配置遠程調(diào)試。(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. 密鑰的分發(fā):
不用計算機上的熵(entropy)值不同,所以當(dāng)我們在一臺計算機上加密,而要在另一臺計算機上解密時,我們不能直接傳送Key.Key文件,而只能使用EntLib配置工具:
(1) 導(dǎo)出密鑰(Export Key)->輸入密碼(password);
(2) 配置工具會將Key.Key文件中的密鑰進行DPAPI解密,再根據(jù)輸入的密碼組織成密鑰進行加密,生成txt文件;
(3) 傳輸該txt文件;
(4) 另一臺計算機上,使用EntLib創(chuàng)建加密Provider時,選擇從txt文件中導(dǎo)入密鑰,輸入剛才加密用的密鑰(password),EntLib會解密txt文件并進行DPAPI加密后存到本地計算機上。
密鑰分發(fā)太繁雜了,導(dǎo)來導(dǎo)去的,實際項目中:譬如一個服務(wù)器和N個客戶端,每個客戶端獨占一個密鑰,誰會這樣分發(fā)密鑰!感覺玩玩還行,適用價值不高...
6. 關(guān)于DPAPI(http://www.microsoft.com/china/technet/security/guidance/secmod21.mspx):
(1) Windows2000操作系統(tǒng)和更高版本的操作系統(tǒng)提供了用于加密和解密數(shù)據(jù)的Win32數(shù)據(jù)保護API(DPAPI);
(2) DPAPI是加密API(Crypto API)的一部分并且是在crypt32.dll中實現(xiàn)的。它包含兩個方法:CryptProtectData和 CryptUnprotectData;
(3) DPAPI 特別有用,因為它能夠消除使用密碼的應(yīng)用程序所帶來的密鑰管理問題。雖然加密能確保數(shù)據(jù)安全,但您必須采取額外的步驟來確保密鑰的安全。DPAPI使用與DPAPI函數(shù)的調(diào)用代碼關(guān)聯(lián)的用戶帳戶的密碼,以便派生加密密鑰。因此,是操作系統(tǒng)(而非應(yīng)用程序)管理著密鑰。
(4) DPAPI 能夠與計算機存儲或用戶存儲(需要一個已加載的用戶配置文件)配合使用。DPAPI 默認情況下用于用戶存儲,但您可以通過將 CRYPTPROTECT_LOCAL_MACHINE 標志傳遞給 DPAPI 函數(shù)來指定使用計算機存儲。
(5) 這種用戶配置文件方式提供了一個額外的安全層,因為它限制了哪些用戶能訪問機密內(nèi)容。只有加密該數(shù)據(jù)的用戶才能解密該數(shù)據(jù)。但是,當(dāng)通過 ASP.NET Web 應(yīng)用程序使用 DPAPI 時,使用用戶配置文件需要您執(zhí)行額外的開發(fā)工作,因為您需要采取明確的步驟來加載和卸載用戶配置文件(ASP.NET 不會自動加載用戶配置文件)。
(6) 計算機存儲方式更容易開發(fā),因為它不需要管理用戶配置文件。但是,除非使用一個附加的熵參數(shù),否則并不安全,因為該計算機的任何用戶都可以解密數(shù)據(jù)。(熵是一個設(shè)計用來使解密機密內(nèi)容更為困難的隨機值)。使用附加的熵參數(shù)出現(xiàn)的問題在于它必須由應(yīng)用程序安全地存儲起來,這帶來了另一個密鑰管理問題。
注意:如果您將 DPAPI 和計算機存儲一起使用,那么加密字符串僅適用于給定的計算機,因此您必須在每臺計算機上生成加密數(shù)據(jù)。不要在場或群集中將加密數(shù)據(jù)從一臺計算機復(fù)制到另一臺計算機。
如果將 DPAPI 和用戶存儲一起使用,則可以用一個漫游的用戶配置文件在任何一臺計算機上解密數(shù)據(jù)。
有關(guān)對稱加密和非對稱加密的更多支持,可以參考我以前寫的:http://www.rzrgm.cn/happyhippy/category/79936.html
浙公網(wǎng)安備 33010602011771號