首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WinForm 本地保存密碼:正確選擇加密算法與實現方案

     編輯:程式設計綜合問答

需求:WinForm 應用將用戶輸入的密碼加密保存至本地 setting.ini,下次讀取時解密填入。關鍵在於選擇可逆的加密算法,而非不可逆的哈希算法。

核心誤區:MD5 不能用於加密

MD5、SHA256 等是哈希/摘要算法,特性是單向不可逆,適用於驗證完整性、存儲密碼摘要(配合鹽值),絕不可用於需要解密的場景。

正確選擇:對稱加密(AES)

  • AES (Advanced Encryption Standard):國際標準對稱加密,密鑰長度 128/192/256 位,性能高、安全性強,可加密可解密,最適合本地配置文件加密。
  • 替代:DES(已淘汰)、3DES(較慢)、ChaCha20(現代流加密,庫支持較少)。

完整實現(C# AES 加密解密工具類)

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)。
  • 完整性校驗:加密數據前加入 HMAC-SHA256 簽名,解密前驗證防篡改。
  • 文件權限:設置 setting.ini 僅當前用戶可讀寫(File.GetAccessControl)。

參考資源

作者提供的完整示例下載:C# AES 加密解密示例

記住:需要解密時用 AES,只需驗證時用 BCrypt/Argon2/SCrypt 哈希,這是密碼學應用的鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved