在现代软件开发中,C#配置加密 是保障应用程序安全的重要环节。无论是数据库连接字符串、API密钥还是其他敏感配置信息,若以明文形式存储在 appsettings.json 或 Web.config 中,极易被恶意利用。本文将手把手教你如何在 C# 项目中实现分层加密与解密机制,确保你的应用既安全又易于维护。
“分层加密”指的是对配置信息进行多级保护:例如,在开发环境使用简单加密,在生产环境使用更高级别的加密(如基于证书或 Azure Key Vault)。这样既能满足不同环境的安全需求,又能保持代码结构清晰。
我们首先实现一个基于 AES(高级加密标准)的对称加密工具类。AES 安全性高、性能好,适合本地配置加密。
using System;using System.IO;using System.Security.Cryptography;using System.Text;public static class AesEncryptionHelper{ private const int KeySize = 256; // AES-256 private const int IvSize = 128 / 8; // 128 bits = 16 bytes public static string Encrypt(string plainText, string password) { if (string.IsNullOrEmpty(plainText) || string.IsNullOrEmpty(password)) throw new ArgumentException("参数不能为空。"); byte[] salt = new byte[16]; using (var rng = RandomNumberGenerator.Create()) rng.GetBytes(salt); byte[] key = DeriveKey(password, salt); using (var aes = Aes.Create()) { aes.Key = key; aes.GenerateIV(); using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV)) using (var ms = new MemoryStream()) { ms.Write(salt, 0, salt.Length); ms.Write(aes.IV, 0, aes.IV.Length); using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) using (var sw = new StreamWriter(cs)) { sw.Write(plainText); } return Convert.ToBase64String(ms.ToArray()); } } } public static string Decrypt(string cipherText, string password) { if (string.IsNullOrEmpty(cipherText) || string.IsNullOrEmpty(password)) throw new ArgumentException("参数不能为空。"); byte[] data = Convert.FromBase64String(cipherText); byte[] salt = new byte[16]; Array.Copy(data, 0, salt, 0, 16); byte[] iv = new byte[IvSize]; Array.Copy(data, 16, iv, 0, IvSize); byte[] encryptedData = new byte[data.Length - 16 - IvSize]; Array.Copy(data, 16 + IvSize, encryptedData, 0, encryptedData.Length); byte[] key = DeriveKey(password, salt); using (var aes = Aes.Create()) { aes.Key = key; aes.IV = iv; using (var decryptor = aes.CreateDecryptor(aes.Key, aes.IV)) using (var ms = new MemoryStream(encryptedData)) using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) using (var sr = new StreamReader(cs)) { return sr.ReadToEnd(); } } } private static byte[] DeriveKey(string password, byte[] salt) { using (var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 10000, HashAlgorithmName.SHA256)) return pbkdf2.GetBytes(KeySize / 8); }} 假设你有一个数据库连接字符串需要加密。你可以先用上述工具加密它:
// 加密示例string connectionString = "Server=localhost;Database=MyApp;User=sa;Password=secret123";string encrypted = AesEncryptionHelper.Encrypt(connectionString, "YourStrongPassword!@#");Console.WriteLine(encrypted); // 将输出结果复制到配置文件 然后在 appsettings.json 中存储加密后的字符串:
{ "ConnectionStrings": { "DefaultConnection": "ENCRYPTED_VALUE_HERE" }, "Security": { "ConfigEncryptionKey": "YourStrongPassword!@#" }} 在 ASP.NET Core 中,我们可以在 Program.cs 或 Startup.cs 中注册一个配置提供者,或者直接在服务注册时解密:
// Program.cs (.NET 6+)var builder = WebApplication.CreateBuilder(args);var config = builder.Configuration;var encryptionKey = config["Security:ConfigEncryptionKey"];var encryptedConn = config.GetConnectionString("DefaultConnection");if (!string.IsNullOrEmpty(encryptedConn) && encryptedConn.StartsWith("ENC:")){ var realEncrypted = encryptedConn["ENC:".Length..]; var decrypted = AesEncryptionHelper.Decrypt(realEncrypted, encryptionKey); // 替换为明文(仅在内存中) config["ConnectionStrings:DefaultConnection"] = decrypted;}// 正常注册服务...builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(config.GetConnectionString("DefaultConnection"))); 注意:我们在加密值前加了 ENC: 前缀,便于识别哪些配置是加密的。
为了实现C#分层解密,我们可以根据环境变量决定使用哪种解密方式:
例如:
string GetDecryptionKey(IConfiguration config, IWebHostEnvironment env){ if (env.IsDevelopment()) return config["Security:LocalKey"]; if (env.IsProduction()) { // 从 Key Vault 获取 // return await keyVaultClient.GetSecretAsync("ConfigDecryptionKey"); return Environment.GetEnvironmentVariable("PROD_DECRYPTION_KEY"); } throw new InvalidOperationException("未知环境");} 通过本文,你学会了如何在 C# 项目中实现应用程序配置安全的分层加密方案。这种模式不仅提升了C#敏感信息保护能力,还兼顾了开发效率与部署灵活性。记住:安全不是一次性任务,而是持续的过程。
现在就动手改造你的项目吧!让每一行配置都安全无忧。
本文由主机测评网于2025-12-25发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251212430.html