3 回答

TA貢獻1829條經驗 獲得超13個贊
如果您只是要驗證/驗證輸入的用戶名和密碼,請使用Rfc2898DerivedBytes類(也稱為基于密碼的密鑰派生功能2或PBKDF2)。這比使用諸如Triple DES或AES之類的加密方法更安全,因為沒有實際的方法可以將RFC2898DerivedBytes的結果返回到密碼。您只能從密碼轉到結果。請參閱從密碼字符串派生加密密鑰和IV時,可以將SHA1密碼哈希用作鹽嗎?有關.Net或字符串的示例和討論,請使用密碼c#Metro Style for WinRT / Metro 進行加密/解密。
如果您要存儲密碼以供重復使用,例如將其提供給第三方,請使用Windows數據保護API(DPAPI)。它使用操作系統生成和受保護的密鑰以及三重DES加密算法來加密和解密信息。這意味著您的應用程序不必擔心生成和保護加密密鑰,這是使用加密技術時的主要問題。
在C#中,使用System.Security.Cryptography.ProtectedData類。例如,要加密一條數據,請使用ProtectedData.Protect():
// Data to protect. Convert a string to a byte[] using Encoding.UTF8.GetBytes().
byte[] plaintext;
// Generate additional entropy (will be used as the Initialization vector)
byte[] entropy = new byte[20];
using(RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(entropy);
}
byte[] ciphertext = ProtectedData.Protect(plaintext, entropy,
DataProtectionScope.CurrentUser);
安全地存儲熵和密文,例如在設置了權限的文件或注冊表項中,這樣只有當前用戶才能讀取它。要訪問原始數據,請使用ProtectedData.Unprotect():
byte[] plaintext= ProtectedData.Unprotect(ciphertext, entropy,
DataProtectionScope.CurrentUser);
請注意,還有其他安全注意事項。例如,避免將諸如密碼之類的機密存儲為string。字符串是不可變的,因為無法在內存中通知它們,因此查看應用程序內存或內存轉儲的人可能會看到密碼。請改用SecureString或byte [],并記住在不再需要密碼時立即進行處理或清零。

TA貢獻1812條經驗 獲得超5個贊
DPAPI僅用于此目的。用戶首次輸入密碼時,請使用DPAPI加密密碼,并將其存儲在安全的位置(用戶注冊表,用戶應用程序數據目錄,是一些選擇)。每當啟動該應用程序時,請檢查位置以查看您的密鑰是否存在,是否使用DPAPI對其進行解密并允許訪問,否則將其拒絕。
添加回答
舉報