前言

在我们开发过程中基本上不可或缺的用到一些敏感机密数据,比如SQL服务器的连接串或者是OAuth2Secret等,这些敏感数据在代码中是不太安全的,我们不应该在源代码中存储密码和其他的敏感数据,一种推荐的方式是通过Asp.Net Core机密管理器

机密管理器

ASP.NET Core 中,机密管理器通常指的是一种工具或机制,用于安全地存储和管理应用程序中的敏感数据,如数据库连接字符串、API 密钥、密码等。这样的工具可以帮助开发人员有效地管理敏感信息,避免将其硬编码在代码中或与源代码一同提交到版本控制系统中,从而提高数据安全性和保密性。

通过上面我们可以得知,应用机密存储和项目数在不同的位置,也就是说不被 git 等源代码管理器所管理,所以不会随源代码迁入到远程服务器。

为什么要使用机密管理器:

  • 安全性:通过使用机密管理器,可以将敏感数据存储在安全的位置,避免在代码中明文存储密码等敏感信息,从而减少数据泄露的风险。

  • 便捷性:机密管理器提供了方便的方式来存储和访问敏感数据,使开发人员能够轻松地在开发过程中使用这些数据,而无需担心泄露或不当处理。

  • 灵活性:通过机密管理器,可以轻松地在不同环境中管理不同的敏感数据,如开发、测试和生产环境,同时确保每个环境中的数据安全性。

  • 遵循最佳实践:使用机密管理器有助于遵循最佳实践,如将敏感数据与应用程序代码分离、避免硬编码密码等敏感信息,提高应用程序的安全性和可维护性。

如何启用机密存储

有两种方案第一种是使用CLI第二种是使用Visual Studio

我们创建一个新的WebApi 项目dotNetParadise.UserSecret

使用CLI

机密管理器工具包含一个 init 命令 用来启用机密存储,在项目所在的目录,在我的示例中就是Api项目dotNetParadise.UserSecret的所在目录执行一下命令:

dotnet user-secrets init

通过输出我们可以看到在我们项目的CSPROJ文件生成了一个UserSecretsId 元素添加到项目文件的 PropertyGroup 中,内部文本是任意的,但对于项目来说是唯一的。

  <PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>c3cda712-dc63-439b-b6af-9c4d6060fde2</UserSecretsId>
</PropertyGroup>

设置机密

使用 dotnet user-secrets set 命令来存储机密数据。

在项目文件夹目录中执行此命令

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

在这个示例中,使用 dotnet user-secrets set 命令设置了一个名为 "Movies:ServiceApiKey" 的应用机密,其值为 "12345"。冒号表示 "Movies" 是具有 "ServiceApiKey" 属性的对象文字。

我们设置好的机密数据存到了哪里?

Windows系统中

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

比如我刚才添加的就在机密存储位置:

%APPDATA%\Microsoft\UserSecrets\c3cda712-dc63-439b-b6af-9c4d6060fde2\secrets.json

看一下里面的内容

{
"Movies:ServiceApiKey": "12345"
}

也可以通过单击该项目(项目名称),然后从上下文菜单中选择“管理用户机密”设置,在VS编辑器查看secrets.json机密数据。

--project 属性

除了在项目文件目录中执行dotnet user-secrets set命令设置机密之外,还可以在通过 --project 选项用于指定项目文件所在的文件系统路径,以便在其他目录中使用User Secrets机密管理器工具,这种用法允许从任意目录设置应用机密,而不仅限于项目文件所在的当前目录

dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"

机密管理器工具不会加密存储的机密,不得被视为受信任的存储,它仅用于开发,密钥和值存储在用户配置文件目录中的 JSON 配置文件中。

使用Visual Studio

当在 Visual Studio 中进行敏感数据管理时,可以按照以下步骤操作:

  • 在解决方案资源管理器中右键 单击该项目(项目名称),然后从上下文菜单中选择“管理用户机密”

  • Visual Studio 将自动为该项目添加一个 UserSecretsId 元素,其中填充有一个唯一的 GUID

设置完之后在 VS 的编辑界面就会打开一个secrets.json文件

{}

这里面是一个空的 json 串,可以手动设置机密键值对象,也可以通过dotnet user-secrets set来设置机密数据

批量设置机密

可以通过一个json文件来批量设置机密

type .\input.json | dotnet user-secrets set

读取机密

Asp.Net Core 中我们在项目中读取配置如appSetting.json或者环境变量的参数都是通过IConfiguration对象来操作,机密的读取和Asp.Net Core的配置都是一样的我们来实战一下

var apiKey = builder.Configuration["Movies:ServiceApiKey"];
Console.WriteLine(apiKey);

可以看到机密信息已经正常读到。

配置的优先级

那么如果 user-secretsappSetting.json或者还有其他的配置源设置相同的数据,那个优先级高呢?

根据Asp.Net Core 配置介绍

WebApplication.CreateBuilder 使用预配置的默认值初始化 WebApplicationBuilder 类的新实例。 经过初始化的 WebApplicationBuilder (builder) 按照以下顺序为应用提供默认配置(从最高优先级到最低优先级):

  • 使用命令行配置提供程序通过命令行参数提供。
  • 使用非前缀环境变量配置提供程序通过非前缀环境变量提供。
  • 应用在 Development 环境中运行时的用户机密。
  • 使用 JSON 配置提供程序通过 appsettings.{Environment}.json 提供。 例如,appsettings.Production.jsonappsettings.Development.json
  • 使用 JSON 配置提供程序通过 appsettings.json 提供。

可以看出如果用户机密比默认的 appsettings.json 优先级要高。

对应机密的绑定成POCO对象和 Asp.Net Core 使用配置一样可以用IConfiguration提供的各种扩展如Get,Bind等来实现,此处不过多介绍

列出机密

从所在项目目录中运行

dotnet user-secrets list

输出:

Movies:ServiceApiKey = 12345

删除单个机密

dotnet user-secrets remove Movies:ServiceApiKey

使用 dotnet user-secrets remove 命令来删除 ASP.NET Core 项目中的单个机密。在这个示例中,执行命令 dotnet user-secrets remove Movies:ServiceApiKey 将删除名为 "Movies:ServiceApiKey" 的机密信息。

通过这种方式,你可以方便地管理和更新项目中的机密数据,确保不再需要的敏感信息不再存储在用户机密存储中。

删除所有机密

dotnet user-secrets clear

dotnet user-secrets clear 用于清除 ASP.NET Core 项目中存储的所有用户机密。执行这个命令将删除用户机密存储中的所有机密信息,使存储中不再包含任何敏感数据。

使用 dotnet user-secrets clear 命令是一种快速清除整个用户机密存储中数据的方式,适用于需要重置或清除所有敏感信息的情况。请谨慎使用此命令,确保在执行之前备份重要的机密数据。

最后

面向非Web的环境,可以参考下方官网的实现,本文注重讲解了通过user-secrets来管理本地的机密,线上环境的机密配置可以ASP.NET Core 中的 Azure Key Vault 配置提供程序,或者大家如果在k8s的环境中可以通过Secret或者ConfigMap,亦或是配置中心等方式来让自己的机密信息避免在源码中出现。

安全机密管理:Asp.Net Core中的本地敏感数据保护技巧的更多相关文章

  1. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  2. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  3. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  4. ASP.NET Core中的依赖注入(3): 服务的注册与提供

    在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...

  5. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】

    本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还 ...

  6. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】

    通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...

  7. ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】

    到目前为止,我们定义的ServiceProvider已经实现了基本的服务提供和回收功能,但是依然漏掉了一些必需的细节特性.这些特性包括如何针对IServiceProvider接口提供一个Service ...

  8. 在Asp.NET Core中如何优雅的管理用户机密数据

    在Asp.NET Core中如何优雅的管理用户机密数据 背景 回顾 在软件开发过程中,使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法.在早期VB/VB.NET时代,经常使用.ini文 ...

  9. ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态

    原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...

  10. ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

随机推荐

  1. 项目性能优化—使用JMeter压测SpringBoot项目

    项目性能优化-使用JMeter压测SpringBoot项目 我们的压力测试架构图如下: 配置JMeter 在JMeter的bin目录,双击jmeter.bat 新建一个测试计划,并右键添加线程组: 进 ...

  2. 记录--从原理分析vue开发环境搭建的全部过程

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 平时大家开发vue项目的时候,相信大部分人都是使用 vue-cli脚手架生成的项目架构,然后 npm run install 安装依赖,n ...

  3. KingbaseES V8R6备份恢复案例之---备份crond计划任务的调整

    案例说明: 在KingbaseES V8R6数据库通常备份建立的crond任务,默认由root用户建立,写入到/etc/cron.d/KINGBASECRON文件中,在有的生产环境限制了普通用户使用r ...

  4. List和ObservableCollection的转换

    1.我们后台查询全部List数据的时候,前台需要ObservableCollection展示 这个时候List需要转换成ObservableCollection public static Obser ...

  5. Ubuntu20.04 LTS国内源安装指定版本Docker/docker-compose

    1.卸载旧版本Docker #卸载旧版本docker sudo apt-get remove docker docker-engine docker-ce docker.io #清空旧版docker占 ...

  6. SQL PRIMARY KEY 约束- 唯一标识表中记录的关键约束

    SQL NOT NULL 约束 SQL NOT NULL 约束用于强制确保列不接受 NULL 值.这意味着该字段始终包含一个值,而不允许插入新记录或更新记录时不提供此字段的值. 在 CREATE TA ...

  7. Kubernetes(K8S)命令指南

    本文提供了一份全面的Kubernetes(K8S)命令指南,旨在帮助用户掌握和运用K8S的各种命令. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网 ...

  8. Mac系统,Qt工程转xcode工程,打包pkg

    序言: 程序使用Qt开发,程序主要功能是调用摄像头.需要打包成pkg给到用户安装,打包用到的是xcode. 实际操作: 一.Qt工程转xcode工程 // 打开终端,cd到项目根目录(CamScan. ...

  9. HarmonyOS分布式文件系统开发指导

      分布式文件系统概述 分布式文件系统(hmdfs,HarmonyOS Distributed File System)提供跨设备的文件访问能力,适用于如下场景: ● 两台设备组网,用户可以利用一台设 ...

  10. HH的项链—树状数组

    题目描述 HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义. HH不断地收集新的贝壳,因此他的项链变得越来越长.有一天 ...