安全机密管理:Asp.Net Core中的本地敏感数据保护技巧
扫描二维码随身看资讯
使用手机 二维码应用 扫描右侧二维码,您可以
1. 在手机上细细品读~
2. 分享给您的微信好友或朋友圈~
前言
在我们开发过程中基本上不可或缺的用到一些敏感机密数据,比如
SQL
服务器的连接串或者是
OAuth2
的
Secret
等,这些敏感数据在代码中是不太安全的,我们不应该在源代码中存储密码和其他的敏感数据,一种推荐的方式是通过
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-secrets
和
appSetting.json
或者还有其他的配置源设置相同的数据,那个优先级高呢?
根据 Asp.Net Core 配置 介绍
WebApplication.CreateBuilder
使用预配置的默认值初始化WebApplicationBuilder
类的新实例。 经过初始化的WebApplicationBuilder (builder)
按照以下顺序为应用提供默认配置(从最高优先级到最低优先级):
- 使用命令行配置提供程序通过命令行参数提供。
- 使用非前缀环境变量配置提供程序通过非前缀环境变量提供。
-
应用在
Development
环境中运行时的用户机密。 -
使用
JSON
配置提供程序通过appsettings.{Environment}.json
提供。 例如,appsettings.Production.json
和appsettings.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
,亦或是配置中心等方式来让自己的机密信息避免在源码中出现。
-
在开发过程中保护机密
?欢迎关注笔者公众号一起学习交流,获取更多有用的知识~
- 三角洲行动 手游最新版
- 蜡笔小新我与博士的暑假 安卓版
- 欧陆战争5三国争雄七星版下载 v2.6.2 安卓版
- 生死狙击 手机版免费
- 永恒之巅 加强版
- 神途手游总登录器版下载 v12.20220113 安卓版
- 欢乐泡泡龙红包版下载 v1.0.7 安卓版
- 海精灵战队手游下载 v1.0 安卓版
- 手动挡停车场模组版自带车标
- 宝宝巴士美食嘉年华
- 神偷鲍勃 无广告
- 游戏蜂窝手游脚本
- 关于我转生变成史莱姆这档事新世界正版
- 桌面万能小组件
- Quill 2.0发布:富文本编辑器的重大更新
- .NET周刊【4月第2期 2024-04-21】
- lodash已死?radash最全使用介绍(附源码说明)—— Array方法篇(4)
- 使用“我要做计划”软件的自定义目标方法
- RAG模型的reranking策略:提升文本生成任务准确度
- MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍
- 如何在青柠设计中给图片加相框
- 如何在58同城软件中设置接收消息通知?
- 学习如何在八点课程表中屏蔽消息
- Beetl模板引擎的使用及GroupTemplate核心类源码解析
- 深度解读《深度探索C++对象模型》之继承关系的存取效率分析
- 使用 Prometheus-Operator 进行 Prometheus + Keda 分片自动缩放
- 1
加查之花 正版
- 2
爪女孩 最新版
- 3
企鹅岛 官方正版中文版
- 4
捕鱼大世界 无限金币版
- 5
球球英雄 手游
- 6
内蒙打大a真人版
- 7
烦人的村民 手机版
- 8
跳跃之王手游
- 9
蛋仔派对 国服版本
- 10
情商天花板 2024最新版