net核心程序中使用用户秘密存储敏感数据

  

前言

在开发中经常会用到一些敏感数据比如AppSecret或数据库连接字符串无论是硬编码还是写在配置文件中最终都要推到svn或git上。对于开源项目这些敏感数据就无隐私可言了对于私有项目一旦源代码管理服务器被黑这些敏感数据也将暴露无所遗。以最佳实践就是不要将敏感数据写到源代码中。

以往我们常常将数据库连接字符串写在web . config中。网络核心中写在appsettings。json中开发环境下如果一个开发者修改了连接字符串为了不影响其他开发者每次提交代码的时候就应该忽略该配置文件如果还添加了其他配置必须提交的话要么先撤销连接字符串的修改再提交要么直接提交会影响其他开发人员。很多时候我们就是直接提交了大不了其他开发者拉下来代码再修改一下。但是最佳实践就是不要写在配置文件中。

注意上面提到的问题都是在开发环境下。

秘密经理。网络核心中为我们提供了叫秘密经理的工具可以实现上文中的最佳实践再次强调一次秘密经理只适用于开发环境中。

下面说一下秘密经理它帮我们抽象了一些细节比如数据存储在哪以及如何存储的问题。简单来说它帮助我们将数据以明文的形式存在了本地的一个json文件中。系统不同存储的位置也不一样。

<强> Windows

 % APPDATA % \微软\ UserSecrets \ & lt; userSecretsId> \秘密。json 

<>强Linux

 ~/.microsoft/usersecrets/& lt; userSecretsId>/秘密。json 

<>强Mac

 ~/.microsoft/usersecrets/& lt; userSecretsId>/秘密。json 

userSecretsId是在。csproj文件中指定的会在下文讲到。

安装,使用

配置用户秘密及访问需要用到两个包分别为

 Microsoft.Extensions.SecretManager.Tools 
 Microsoft.Extensions.Configuration。UserSecrets 

简单说一下两者的作用第一个是工具包可以使用dotnet user-secrets命令将数据存储到json文件中第二个包可以通过。网络核心的配置系统访问存储在json文件中的数据。

 dotnet  user-secrets  - h 

这个命令可以查看秘密经理的用法。

它有4个命令

命令描述语法明确删除程序中所有的secretsdotnet user-secrets clearlist列举程序中所有的secretsdotnet user-secrets listremove删除指定的secretdotnet user-secrets删除NameOfSecretset设置secretdotnet user-secrets设置NameOfSecret ValueOfSecret

以Mac上举例上面的命令都是操作~/.microsoft/usersecrets/\/秘密。json这个文件userSecretsId指定了是哪个项目的秘密。

userSecretsId在.csproj文件中指定。

 & lt; PropertyGroup>
  & lt;才能UserSecretsId> userSecretsId的值& lt;/UserSecretsId>
  & lt;/PropertyGroup> 

在mac或linux上userSecretsId的值可以通过uuidgen生成。

在Microsoft.Extensions.Configuration。UserSecrets包扩展了ConfigurationBuilder包含一个AddUserSecrets的扩展方法。如果想通过配置访问用户秘密只需要在调用build.AddUserSecrets()即可。

 if  (env.IsDevelopment ())
  {
  ,,,//,搜索包含类型创业的程序集添加User 秘密的配置源启动也可以换成其他程序集中的其他类型
  ,,,builder.AddUserSecrets ();
  }

或干脆直接指定userSecretsId

<>之前如果(env.IsDevelopment ())   {   ,,,builder.AddUserSecrets (“UserSecretsId”);   }

然后就可以通过配置(“NameOfSecret”)访问到用户秘密了。

项目实践

下面通过一个控制台程序演示。

<李>

mkdir user-secrets,,cd user-secrets #新建一个目录

<李>

dotnet新的控制台#创建一个控制台应用

<李>

dotnet恢复#还原包

<李>

dotnet Microsoft.Extensions.Configuration添加包。UserSecrets - v 1.1.2 #安装包

<李>

代码。#使用Visual Studio代码打开

<李>

在user-secrets.csproj中添加UserSecretsId

 & lt; PropertyGroup>
  & lt; UserSecretsId> 3 bf2d901 - 89 b9 - 437 d - 8856 cca63d4606f7
  & lt;/PropertyGroup> 

以及SecretManager工具包

 & lt; ItemGroup>
  & lt; DotNetCliToolReference 包括=" Microsoft.Extensions.SecretManager.Tools ", Version=" 1.0.1,/比;
  & lt;/ItemGroup> 
<李>

dotnet user-secrets设置AppKey 12345 #添加名为AppKey的秘密

<李>

为了判断是在开发环境中需要添加环境变量因此需要再安装一个包
dotnet Microsoft.Extensions.Configuration添加包。李EnvironmentVariables - v 1.1.2

<李>

打开Program.cs加入以下代码

net核心程序中使用用户秘密存储敏感数据