查看原文
其他

ASP.NET Core 中如何加密 Configuration ?

DotNet 2022-07-19

The following article is from NET技术问答 Author Stackoverflow

咨询区


web.config 已进入历史垃圾堆,请问现在的 asp.net core 如何更好的做到将敏感信息(password,token) 存储到 configuration 中?换句话说:是否可以自动化解密 appsettings.json 中的 configuration section 节中加密的内容。


回答区


要想保护隐私,最好的方式就是将密文放置在 appsettings.json 中,那如何让程序自动化解密在 appsetting.json 中的密文呢?通常有两种做法。


1、继承并实现 ConfigurationProvider, IConfigurationSource

这种方式太麻烦,我就不演示了。

2、重写 JsonConfigurationProvider 方法

这种方式相对简单,重写它的 Load 方法并实现解密逻辑,参考如下代码。

public class JsonConfigurationProvider2 : JsonConfigurationProvider  
{  
    public JsonConfigurationProvider2(JsonConfigurationSource2 source) : base(source)  
    {  
    }  
  
    public override void Load(Stream stream)  
    {  
        // Let the base class do the heavy lifting.  
        base.Load(stream);  
  
        // Do decryption here, you can tap into the Data property like so:  
  
         Data["abc:password"] = MyEncryptionLibrary.Decrypt(Data["abc:password"]);  
  
        // But you have to make your own MyEncryptionLibrary, not included here  
    }  
}  
  
public class JsonConfigurationSource2 : JsonConfigurationSource  
{  
    public override IConfigurationProvider Build(IConfigurationBuilder builder)  
    {  
        EnsureDefaults(builder);  
        return new JsonConfigurationProvider2(this);  
    }  
}  
  
public static class JsonConfigurationExtensions2  
{  
    public static IConfigurationBuilder AddJsonFile2(this IConfigurationBuilder builder, string path, bool optional,  
        bool reloadOnChange)
  
    {  
        if (builder == null)  
        {  
            throw new ArgumentNullException(nameof(builder));  
        }  
        if (string.IsNullOrEmpty(path))  
        {  
            throw new ArgumentException("File path must be a non-empty string.");  
        }  
  
        var source = new JsonConfigurationSource2  
        {  
            FileProvider = null,  
            Path = path,  
            Optional = optional,  
            ReloadOnChange = reloadOnChange  
        };  
  
        source.ResolveFileProvider();  
        builder.Add(source);  
        return builder;  
    }  
}  

有了它,然后就可以在 CreateHostBuilder 时进行配置。

public static IHostBuilder CreateHostBuilder(string[] args) =>  
            Host.CreateDefaultBuilder(args)  
            .ConfigureAppConfiguration(config =>  
            {  
                config.AddJsonFile2("xxx.appsettings"truetrue);  
            })  
            .ConfigureWebHostDefaults(webBuilder =>  
            {  
                webBuilder.UseStartup<Startup>();  
            });  
  

点评区

其实在很早的时候我一直不理解这种做法,既然要放在配置文件中为啥还要加密起来,在平时开发的时候给自己带来了诸多不便,为此我还写了一篇文章 配置文件中的数据库连接串加密了,你以为我就挖不出来吗?来聊这个问题,我可以直接用 windbg 到进程里拿明文字符串,毕竟最后的 SqlCommand 需要明文去连接数据库哈,只能说这种防君子不防小人。

- EOF -

推荐阅读  点击标题可跳转
.NET 开发者社区推动的 .NET 6 新 API.NET Core 中使用 RabbitMQ 六种队列模式WinForm/WPF 程序嵌入Web 网页解决方案


看完本文有收获?请转发分享给更多人

推荐关注「DotNet」,提升.Net技能 

点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存