C#配置文件加密解密的实现方案

 更新时间:2026年03月12日 08:36:21   作者:猫猫头不加班  
在C#项目中,保护敏感配置信息(如数据库连接字符串、API密钥等)至关重要,下面介绍一种最简便、最实用的配置文件保护方法,无需复杂依赖,直接利用.NET框架内置功能,需要的朋友可以参考下

方案核心:使用Windows数据保护API (DPAPI) 或 托管封装

1. 最简单实现:使用ProtectedData类(DPAPI封装)

DPAPI是Windows内置的数据保护接口,无需管理密钥,非常适合单机应用。

using System.Security.Cryptography;
using System.Text;
public static class SimpleConfigProtector
{
    // 加密字符串
    public static string Encrypt(string plainText)
    {
        byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
        byte[] encryptedBytes = ProtectedData.Protect(
            plainBytes, 
            entropy: null, // 可选的附加熵值,增加安全性
            scope: DataProtectionScope.CurrentUser // 或 LocalMachine
        );
        return Convert.ToBase64String(encryptedBytes);
    }
    // 解密字符串
    public static string Decrypt(string encryptedText)
    {
        byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
        byte[] plainBytes = ProtectedData.Unprotect(
            encryptedBytes,
            entropy: null,
            scope: DataProtectionScope.CurrentUser
        );
        return Encoding.UTF8.GetString(plainBytes);
    }
}

2. 配置文件集成方案

appsettings.json (原始)

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=MyDB;User=sa;Password=MyPass123;"
  },
  "ApiKey": "abc123def456"
}

appsettings.json (加密后)

{
  "ConnectionStrings": {
    "DefaultConnection": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAAA0IAAAAAAA... (加密文本)"
  },
  "ApiKey": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAAA0IAAAAAAA..."
}

配置读取类

public class AppSettings
{
    private readonly IConfiguration _configuration;
    public AppSettings(IConfiguration configuration)
    {
        _configuration = configuration;
    }
    public string GetConnectionString()
    {
        var encrypted = _configuration.GetConnectionString("DefaultConnection");
        return SimpleConfigProtector.Decrypt(encrypted);
    }
    public string GetApiKey()
    {
        var encrypted = _configuration["ApiKey"];
        return SimpleConfigProtector.Decrypt(encrypted);
    }
}

3. 一键加密工具(控制台应用)

// ConfigEncryptor.cs
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("=== 配置文件加密工具 ===");
        Console.Write("输入要加密的文本: ");
        string plainText = Console.ReadLine();
        string encrypted = SimpleConfigProtector.Encrypt(plainText);
        Console.WriteLine($"加密结果: {encrypted}");
        Console.Write("是否测试解密? (y/n): ");
        if (Console.ReadKey().Key == ConsoleKey.Y)
        {
            string decrypted = SimpleConfigProtector.Decrypt(encrypted);
            Console.WriteLine($"\n解密结果: {decrypted}");
        }
    }
}

方案优势与注意事项

优点

  • 零密钥管理:DPAPI自动处理密钥存储
  • 按用户/机器隔离CurrentUser范围防止其他用户解密
  • 无需外部依赖:仅需System.Security.Cryptography
  • 防篡改:加密后的Base64字符串无法直接解读

注意事项

DataProtectionScope选项

  • CurrentUser:只有当前登录用户可解密
  • LocalMachine:本机所有用户可解密(安全性较低)

部署限制

  • DPAPI加密的内容不能跨计算机解密
  • 如需多服务器部署,考虑使用证书加密或Azure Key Vault

加密提示:首次运行时可自动加密配置文件

// 启动时检查并加密配置
if (!IsEncrypted(configValue))
{
    string encrypted = SimpleConfigProtector.Encrypt(configValue);
    // 更新配置文件(谨慎操作)
}

备选方案:如需跨平台/跨机器加密

如果应用需部署到多台服务器,可采用基于证书的加密:

public static class CertificateProtector
{
    public static string EncryptWithCertificate(string plainText, X509Certificate2 cert)
    {
        using RSA rsa = cert.GetRSAPublicKey();
        byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
        byte[] encryptedBytes = rsa.Encrypt(plainBytes, RSAEncryptionPadding.OaepSHA256);
        return Convert.ToBase64String(encryptedBytes);
    }
    public static string DecryptWithCertificate(string encryptedText, X509Certificate2 cert)
    {
        using RSA rsa = cert.GetRSAPrivateKey();
        byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
        byte[] plainBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.OaepSHA256);
        return Encoding.UTF8.GetString(plainBytes);
    }
}

最佳实践建议

  1. 敏感配置项:仅加密真正敏感的数据(密码、密钥),普通配置保持明文
  2. 开发/生产分离:开发环境可不加密,生产环境强制加密
  3. 备份原文:加密前备份原始配置,防止加密失败
  4. 使用配置中心:大型系统建议使用Azure App Configuration/AWS Parameter Store

总结

对于大多数C#应用,DPAPI方案是最简单有效的配置保护方案:

  • 开发简单:仅需10行核心代码
  • 维护方便:无额外密钥管理负担
  • 安全性足:满足大部分应用需求
  • 无缝集成:与ASP.NET Core配置系统完全兼容

只需将敏感配置项替换为加密文本,在读取时自动解密,即可实现"防改写、防窥视"的安全目标。

以上就是C#配置文件加密解密的实现方案的详细内容,更多关于C#配置文件加密解密的资料请关注脚本之家其它相关文章!

相关文章

  • 不安装excel使用c#创建excel文件

    不安装excel使用c#创建excel文件

    这篇文章主要介绍了使用c#创建excel的示例,刚时给出了不安装excel也可创建excel的方法,需要的朋友可以参考下
    2014-02-02
  • C#使用Spire.PDF for .NET实现设置或修改PDF页面尺寸

    C#使用Spire.PDF for .NET实现设置或修改PDF页面尺寸

    在文档处理场景中,调整 PDF 页面尺寸是常见需求,本文将介绍如何使用免费库 Free Spire.PDF for .NET 通过 C# 代码设置或修改 PDF 页面尺寸,有需要的小伙伴可以了解下
    2026-02-02
  • Unity UGUI实现滑动翻页效果

    Unity UGUI实现滑动翻页效果

    这篇文章主要为大家详细介绍了Unity UGUI实现滑动翻页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#实现基于链表的内存记事本实例

    C#实现基于链表的内存记事本实例

    这篇文章主要介绍了C#实现基于链表的内存记事本,实例分析了C#基于链表实现的记事本功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#使用Dns类实现查询主机名对应IP地址

    C#使用Dns类实现查询主机名对应IP地址

    C#中的Dns类能够与默认的DNS服务器进行通信,以检索IP地址,这篇文章主要介绍了C#如何使用Dns类解析出主机对应的IP地址信息,需要的可以参考下
    2024-02-02
  • C#实现ASCII和字符串相互转换的代码示例

    C#实现ASCII和字符串相互转换的代码示例

    在C#编程语言中,ASCII码是一种广泛使用的字符编码标准,它将128个不同的字符与7位的二进制数字对应起来,在处理文本时,我们有时需要将ASCII码与字符串进行相互转换,以下是如何在C#中实现这一操作的详细说明,需要的朋友可以参考下
    2026-01-01
  • C#学习笔记——基本语法

    C#学习笔记——基本语法

    本文给大家详细介绍了C#的基本语法知识以及一些基础知识的汇总,非常的简单基础,有需要的小伙伴可以参考下
    2017-02-02
  • C#中string用法实例详解

    C#中string用法实例详解

    这篇文章主要介绍了C#中string用法,非常详细的总结了比较常见的关于C#中string的几个常用方法,需要的朋友可以参考下
    2014-08-08
  • C#进行文件读写、创建、复制、移动、删除的方法

    C#进行文件读写、创建、复制、移动、删除的方法

    这篇文章主要介绍了C#进行文件读写、创建、复制、移动、删除的方法,涉及C#针对文件操作的常用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • 使用C#对JSON进行序列化和反序列化处理的两种方法

    使用C#对JSON进行序列化和反序列化处理的两种方法

    本指南探讨了如何使用 C# 编程语言进行 JSON 序列化和反序列化,我们将介绍 .NET 生态系统中可用的两个本机选项,即命名空间和广泛使用的 Newtonsoft.Json 库(也称为 Json.NET),需要的朋友可以参考下
    2024-06-06

最新评论