前言 在我們開發(fā)過程中基本上不可或缺的用到一些敏感機(jī)密數(shù)據(jù),比如SQL
服務(wù)器的連接串或者是OAuth2
的Secret
等,這些敏感數(shù)據(jù)在代碼中是不太安全的,我們不應(yīng)該在源代碼中存儲(chǔ)密碼和其他的敏感數(shù)據(jù),一種推薦的方式是通過Asp.Net Core
的機(jī)密管理器 。
機(jī)密管理器 在 ASP.NET Core
中,機(jī)密管理器通常指的是一種工具或機(jī)制,用于安全地存儲(chǔ)和管理應(yīng)用程序中的敏感數(shù)據(jù),如數(shù)據(jù)庫連接字符串、API
密鑰、密碼等。這樣的工具可以幫助開發(fā)人員有效地管理敏感信息,避免將其硬編碼在代碼中或與源代碼一同提交到版本控制系統(tǒng)中,從而提高數(shù)據(jù)安全性和保密性。
通過上面我們可以得知,應(yīng)用機(jī)密存儲(chǔ)和項(xiàng)目數(shù)在不同的位置,也就是說不被 git
等源代碼管理器所管理,所以不會(huì)隨源代碼遷入到遠(yuǎn)程服務(wù)器。
為什么要使用機(jī)密管理器: 安全性:通過使用機(jī)密管理器,可以將敏感數(shù)據(jù)存儲(chǔ)在安全的位置,避免在代碼中明文存儲(chǔ)密碼等敏感信息,從而減少數(shù)據(jù)泄露的風(fēng)險(xiǎn)。
便捷性:機(jī)密管理器提供了方便的方式來存儲(chǔ)和訪問敏感數(shù)據(jù),使開發(fā)人員能夠輕松地在開發(fā)過程中使用這些數(shù)據(jù),而無需擔(dān)心泄露或不當(dāng)處理。
靈活性:通過機(jī)密管理器,可以輕松地在不同環(huán)境中管理不同的敏感數(shù)據(jù),如開發(fā)、測(cè)試和生產(chǎn)環(huán)境,同時(shí)確保每個(gè)環(huán)境中的數(shù)據(jù)安全性。
遵循最佳實(shí)踐:使用機(jī)密管理器有助于遵循最佳實(shí)踐,如將敏感數(shù)據(jù)與應(yīng)用程序代碼分離、避免硬編碼密碼等敏感信息,提高應(yīng)用程序的安全性和可維護(hù)性。
如何啟用機(jī)密存儲(chǔ) 有兩種方案第一種是使用CLI
第二種是使用Visual Studio
我們創(chuàng)建一個(gè)新的WebApi
項(xiàng)目dotNetParadise.UserSecret
使用CLI
機(jī)密管理器工具包含一個(gè) init
命令 用來啟用機(jī)密存儲(chǔ),在項(xiàng)目所在的目錄,在我的示例中就是Api
項(xiàng)目dotNetParadise.UserSecret
的所在目錄執(zhí)行一下命令:
dotnet user-secrets init
通過輸出我們可以看到在我們項(xiàng)目的CSPROJ
文件生成了一個(gè)UserSecretsId
元素添加到項(xiàng)目文件的 PropertyGroup
中,內(nèi)部文本是任意的,但對(duì)于項(xiàng)目來說是唯一的。
<PropertyGroup >
<TargetFramework > net8.0</TargetFramework >
<Nullable > enable</Nullable >
<ImplicitUsings > enable</ImplicitUsings >
<UserSecretsId > c3cda712-dc63-439b-b6af-9c4d6060fde2</UserSecretsId >
</PropertyGroup >
設(shè)置機(jī)密 使用 dotnet user-secrets set
命令來存儲(chǔ)機(jī)密數(shù)據(jù)。
在項(xiàng)目文件夾目錄中執(zhí)行此命令
dotnet user-secrets set "Movies:ServiceApiKey" "12345 "
在這個(gè)示例中,使用 dotnet user-secrets set
命令設(shè)置了一個(gè)名為 "Movies:ServiceApiKey"
的應(yīng)用機(jī)密,其值為 "12345"
。冒號(hào)表示 "Movies"
是具有 "ServiceApiKey"
屬性的對(duì)象文字。
我們?cè)O(shè)置好的機(jī)密數(shù)據(jù)存到了哪里? 在Windows
系統(tǒng)中
%APPDATA% \Microsoft\UserSecrets\<user_secrets_id>\secrets.json
比如我剛才添加的就在機(jī)密存儲(chǔ)位置:
%APPDATA% \Microsoft\UserSecrets\c3cda712-dc63-439 b-b6af-9 c4d6060fde2\secrets.json
看一下里面的內(nèi)容
{
"Movies:ServiceApiKey" : "12345" }
也可以通過單擊該項(xiàng)目(項(xiàng)目名稱),然后從上下文菜單中選擇“管理用戶機(jī)密”設(shè)置,在VS編輯器
查看secrets.json
機(jī)密數(shù)據(jù)。
--project
屬性除了在項(xiàng)目文件目錄中執(zhí)行dotnet user-secrets set
命令設(shè)置機(jī)密之外,還可以在通過 --project
選項(xiàng)用于指定項(xiàng)目文件所在的文件系統(tǒng)路徑,以便在其他目錄中使用User Secrets
機(jī)密管理器工具,這種用法允許從任意目錄設(shè)置應(yīng)用機(jī)密,而不僅限于項(xiàng)目文件所在的當(dāng)前目錄
dotnet user-secrets set "Movies:ServiceApiKey" "12345 " --project "C:\apps\WebApp1\src\WebApp1"
機(jī)密管理器工具不會(huì)加密存儲(chǔ)的機(jī)密,不得被視為受信任的存儲(chǔ),它僅用于開發(fā),密鑰和值存儲(chǔ)在用戶配置文件目錄中的 JSON
配置文件中。
使用Visual Studio
當(dāng)在 Visual Studio
中進(jìn)行敏感數(shù)據(jù)管理時(shí),可以按照以下步驟操作:
設(shè)置完之后在 VS 的編輯界面就會(huì)打開一個(gè)secrets.json
文件
{ }
這里面是一個(gè)空的 json
串,可以手動(dòng)設(shè)置機(jī)密鍵值對(duì)象,也可以通過dotnet user-secrets set
來設(shè)置機(jī)密數(shù)據(jù)
批量設(shè)置機(jī)密 可以通過一個(gè)json
文件來批量設(shè)置機(jī)密
type .\input.json | dotnet user-secrets set
讀取機(jī)密 在Asp.Net Core
中我們?cè)陧?xiàng)目中讀取配置如appSetting.json
或者環(huán)境變量的參數(shù)都是通過IConfiguration
對(duì)象來操作,機(jī)密的讀取和Asp.Net Core
的配置都是一樣的我們來實(shí)戰(zhàn)一下
var apiKey = builder.Configuration["Movies:ServiceApiKey" ];
Console.WriteLine(apiKey);
可以看到機(jī)密信息已經(jīng)正常讀到。
配置的優(yōu)先級(jí) 那么如果 user-secrets
和appSetting.json
或者還有其他的配置源設(shè)置相同的數(shù)據(jù),那個(gè)優(yōu)先級(jí)高呢?
根據(jù)Asp.Net Core 配置 介紹
WebApplication.CreateBuilder
使用預(yù)配置的默認(rèn)值初始化 WebApplicationBuilder
類的新實(shí)例。 經(jīng)過初始化的 WebApplicationBuilder (builder)
按照以下順序?yàn)閼?yīng)用提供默認(rèn)配置(從最高優(yōu)先級(jí)到最低優(yōu)先級(jí)):
使用命令行配置提供程序通過命令行參數(shù)提供。
使用非前綴環(huán)境變量配置提供程序通過非前綴環(huán)境變量提供。
應(yīng)用在 Development
環(huán)境中運(yùn)行時(shí)的用戶機(jī)密。
使用 JSON
配置提供程序通過 appsettings.{Environment}.json
提供。 例如,appsettings.Production.json
和 appsettings.Development.json
。
使用 JSON
配置提供程序通過 appsettings.json
提供。
可以看出如果用戶機(jī)密比默認(rèn)的 appsettings.json
優(yōu)先級(jí)要高。
對(duì)應(yīng)機(jī)密的綁定成POCO
對(duì)象和 Asp.Net Core
使用配置一樣可以用IConfiguration
提供的各種擴(kuò)展如Get
,Bind
等來實(shí)現(xiàn),此處不過多介紹
列出機(jī)密 從所在項(xiàng)目目錄中運(yùn)行
dotnet user-secrets list
輸出:
Movies:ServiceApiKey = 12345
刪除單個(gè)機(jī)密 dotnet user-secrets remove Movies:ServiceApiKey
使用 dotnet user-secrets remove
命令來刪除 ASP.NET Core
項(xiàng)目中的單個(gè)機(jī)密。在這個(gè)示例中,執(zhí)行命令 dotnet user-secrets remove Movies:ServiceApiKey
將刪除名為 "Movies:ServiceApiKey"
的機(jī)密信息。
通過這種方式,你可以方便地管理和更新項(xiàng)目中的機(jī)密數(shù)據(jù),確保不再需要的敏感信息不再存儲(chǔ)在用戶機(jī)密存儲(chǔ)中。
刪除所有機(jī)密 dotnet user-secrets clear
dotnet user-secrets clear
用于清除 ASP.NET Core
項(xiàng)目中存儲(chǔ)的所有用戶機(jī)密。執(zhí)行這個(gè)命令將刪除用戶機(jī)密存儲(chǔ)中的所有機(jī)密信息,使存儲(chǔ)中不再包含任何敏感數(shù)據(jù)。
使用 dotnet user-secrets clear
命令是一種快速清除整個(gè)用戶機(jī)密存儲(chǔ)中數(shù)據(jù)的方式,適用于需要重置或清除所有敏感信息的情況。請(qǐng)謹(jǐn)慎使用此命令,確保在執(zhí)行之前備份重要的機(jī)密數(shù)據(jù)。
最后 面向非Web
的環(huán)境,可以參考下方官網(wǎng)的實(shí)現(xiàn),本文注重講解了通過user-secrets
來管理本地的機(jī)密,線上環(huán)境的機(jī)密配置可以ASP.NET Core 中的 Azure Key Vault 配置提供程序 ,或者大家如果在k8s
的環(huán)境中可以通過Secret
或者ConfigMap
,亦或是配置中心等方式來讓自己的機(jī)密信息避免在源碼中出現(xiàn)。
本文來自博客園,作者: 董瑞鵬 ,轉(zhuǎn)載請(qǐng)注明原文鏈接: https://www.cnblogs.com/ruipeng/p/18154605
該文章在 2024/5/27 9:00:49 編輯過