You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET 5 Core应用中实现加密环境变量启动时自动解密

.NET 5 加密环境变量配置解密实现方案

实现思路

通过自定义.NET配置系统的配置源与配置提供者,在配置加载阶段自动完成两个核心操作:

  • 识别带指定后缀的加密环境变量键名,转换为目标配置键
  • 匹配加密值前缀,自动完成密文解密后注入配置系统

实现步骤

1. 实现自定义配置源与配置提供者

using System;
using System.Collections;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;

public class EncryptedEnvironmentVariableConfigurationProvider : ConfigurationProvider
{
    // 加密值识别前缀,与你示例中定义的规则一致
    private const string EncryptedValuePrefix = "#$SELOW#";
    // 加密配置键识别后缀
    private const string EncryptedKeySuffix = "Enc";
    // 环境变量预设前缀
    private const string EnvKeyPrefix = "Product_";

    public override void Load()
    {
        var envVars = Environment.GetEnvironmentVariables();
        var configData = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

        foreach (DictionaryEntry entry in envVars)
        {
            var rawKey = entry.Key.ToString() ?? string.Empty;
            var rawValue = entry.Value?.ToString() ?? string.Empty;

            // 仅处理符合加密规则的环境变量
            if (rawKey.StartsWith(EnvKeyPrefix) 
                && rawKey.EndsWith(EncryptedKeySuffix) 
                && rawValue.StartsWith(EncryptedValuePrefix))
            {
                // 转换为目标配置键:移除前缀和加密后缀
                var targetKey = rawKey[EnvKeyPrefix.Length..^EncryptedKeySuffix.Length];
                // 提取密文内容
                var encryptedContent = rawValue[EncryptedValuePrefix.Length..];
                // 解密后写入配置
                configData[targetKey] = DecryptContent(encryptedContent);
            }
        }

        Data = configData;
    }

    // 替换为你自己的解密实现,建议使用AES等对称加密算法
    private string DecryptContent(string encryptedContent)
    {
        // 此处为示例,实际替换为你的解密逻辑
        // 解密密钥建议通过AWS IAM角色从KMS获取,避免硬编码或存入环境变量
        return "DecryptedString";
    }
}

public class EncryptedEnvironmentVariableConfigurationSource : IConfigurationSource
{
    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new EncryptedEnvironmentVariableConfigurationProvider();
    }
}

2. 注册自定义配置源

在Program.cs的主机构建逻辑中注入自定义配置源:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, configBuilder) =>
        {
            // 添加自定义加密环境变量配置源
            // 加载顺序靠后的配置源会覆盖同键名的前置配置,可根据需要调整插入位置
            configBuilder.Add(new EncryptedEnvironmentVariableConfigurationSource());
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

3. 使用配置

你可以在应用任意位置注入IConfiguration,直接读取解密后的配置:

// 直接读取即可拿到解密后的明文
var secretKey = configuration["SecretKey"];

注意事项

  • 解密密钥不要硬编码或存入环境变量,可通过AWS EC2实例的IAM角色从AWS KMS服务拉取,仅在进程内存中保留,避免密钥泄露
  • 如果你使用多层级配置,环境变量默认用双下划线__表示层级分隔,转换键名时可将双下划线替换为配置系统默认的冒号:即可适配层级结构
  • 如果不需要保留原始加密环境变量的配置项,可以在注入自定义源前移除默认的环境变量配置源,避免冗余配置

内容的提问来源于stack exchange,提问作者Mark Nadig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:36:03