引言

  互联网每隔一段时间就会爆出 【某程序猿在代码托管平台上传了公司机密配置信息,导致公司核心数据被黑客获取或修改】, 一茬又一茬背锅侠层出不穷。拯救自我

  软件工程理论早以加粗字体给出 经典原则:Never store production passwords or other sensitive data in source code

依据这个原则,我们来说一些.Net 开发生涯几种敏感信息分离的方案。
 

头脑风暴

常规思路是【external file方式托管敏感信息】,.gitingore忽略该文件,在部署时预先拷贝该文件到部署目录。

.Net Framework

  可尝试在appSettings配置节启用file属性,file属性可引用外部配置文件,具备为原appSetttings新增或重写同名设置的能力,理论传送门
复制代码
原配置节 <configuration>    <appSettings file="appsecrets.config">    <add key="FtpUserId" value="test_userid" />    <add key="FtpPwd" value="test-pwd">    </appSettings></configuration>
复制代码
复制代码
外置配置文件 <?xml version="1.0" encoding="utf-8" ?><appSettings>    <add key="FtpUrl" value="sftp.rategain.com" />    <add key="FtpUserId" value="RateGain_M&C" />    <add key="FtpPwd" value="RateGain@123" />    <add key="RemotePath" value="/M&C/" />       <!--路径 /M&C/ 需要转义--></appSettings>
复制代码

 

.NetCore
同理类似,可指定加载appsetting.secrets.json文件
复制代码
var hostBuilder = WebHost.CreateDefaultBuilder(args)     .ConfigureAppConfiguration((context, builder) =>    {        builder.AddJsonFile($"appsettings.secrets.json", optional: true);       if (context.HostingEnvironment.IsDevelopment())      {          builder.AddUserSecrets<Startup>(true);      }       builder.AddEnvironmentVariables();    })    .UseStartup<Startup>();
复制代码

据此思路,可将敏感信息交由其他组件托管,.NetCore开发者还有其他3种实践:

-  适用于Dev的Secrets manager tool 托管

ASP.NETCore 在开发环境下保存密钥的方式,总体思路是使用一个匿名GUID引用存储在系统文件夹下的同名配置Json。

-  适用于Azure云的  Azure Key Vault 托管