需求:WinForm 應用將用戶輸入的密碼加密保存至本地 setting.ini,下次讀取時解密填入。關鍵在於選擇可逆的加密算法,而非不可逆的哈希算法。
MD5、SHA256 等是哈希/摘要算法,特性是單向不可逆,適用於驗證完整性、存儲密碼摘要(配合鹽值),絕不可用於需要解密的場景。
DES(已淘汰)、3DES(較慢)、ChaCha20(現代流加密,庫支持較少)。using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
public static class AesHelper
{
// 密鑰需 16/24/32 字節(這裡用固定密鑰演示,生產環境應從安全存儲讀取)
private static readonly byte[] Key = Encoding.UTF8.GetBytes("0123456789ABCDEF0123456789ABCDEF"); // 32字節 = 256位
private static readonly byte[] IV = Encoding.UTF8.GetBytes("ABCDEF0123456789"); // 16字節 = 128位
public static string Encrypt(string plainText)
{
using (Aes aes = Aes.Create())
{
aes.Key = Key;
aes.IV = IV;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = aes.CreateEncryptor();
using (MemoryStream ms = new MemoryStream())
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
using (StreamWriter sw = new StreamWriter(cs))
{
sw.Write(plainText);
sw.Flush();
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
}
}
public static string Decrypt(string cipherText)
{
using (Aes aes = Aes.Create())
{
aes.Key = Key;
aes.IV = IV;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = aes.CreateDecryptor();
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (MemoryStream ms = new MemoryStream(cipherBytes))
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
using (StreamReader sr = new StreamReader(cs))
{
return sr.ReadToEnd();
}
}
}
}
// 保存
string encrypted = AesHelper.Encrypt(textBox1.Text + "|" + textBox2.Text);
File.WriteAllText("setting.ini", encrypted);
// 讀取
if (File.Exists("setting.ini")) {
string decrypted = AesHelper.Decrypt(File.ReadAllText("setting.ini"));
var parts = decrypted.Split('|');
textBox1.Text = parts[0];
textBox2.Text = parts[1];
}
DPAPI (ProtectedData) 加密密鑰後存儲,或要求用戶設置主密碼派生密鑰(PBKDF2)。setting.ini 僅當前用戶可讀寫(File.GetAccessControl)。作者提供的完整示例下載:C# AES 加密解密示例
記住:需要解密時用 AES,只需驗證時用 BCrypt/Argon2/SCrypt 哈希,這是密碼學應用的鐵律。