在Asp.NET Core中如何管理用戶機密數據


背景

回顧

在軟件開發過程中,使用配置文件來管理某些對應用程序運行中需要使用的參數是常見的作法。在早期VB/VB.NET時代,經常使用.ini文件來進行配置管理;而在.NET FX開發中,我們則傾向於使用web.config文件,通過配置appsetting的配置節來處理;而在.NET Core開發中,我們有了新的基於json格式的appsetting.json文件。

無論采用哪種方式,其實配置管理從來都是一件看起來簡單,但影響非常深遠的基礎性工作。尤其是配置的安全性,貫穿應用程序的始終,如果沒能做好安全性問題,極有可能會給系統帶來不可控的風向。

源代碼比配置文件安全么?

有人以為把配置存放在源代碼中,可能比存放在明文的配置文件中似乎更安全,其實是“皇帝的新裝”。

在前不久,筆者的一位朋友就跟我說了一段故事:他說一位同事在離職后,直接將曾經寫過的一段代碼上傳到github的公共倉庫,而這段代碼中包含了某些涉及到原企業的機密數據,還好被github的安全機制提前發現而及時終止了該行為,否則后果不堪設想。

於是,筆者順手查了一下由於有意或無意泄露企業機密,造成企業損失的案例,發現還真不少。例如大疆前員工通過 Github 泄露公司源代碼,被罰 20 萬、獲刑半年 這起案件,也是一個典型的案例。

該員工離職后,將包含關鍵配置信息的源代碼上傳到github的公共倉庫,被黑客利用,使得大量用戶私人數據被黑客獲取,該前員工最終被刑拘。

大部分IT公司都會在入職前進行背景調查,而一旦有案底,可能就已經與許多IT公司無緣;即便是成為創業者,也可能面臨無法跟很多正規企業合作的問題。

小結

所以,安全性問題不容小覷,哪怕時間再忙,也不要急匆匆的就將數據庫連接字符串或其他包含敏感信息的內容輕易的記錄在源代碼或配置文件中。在這個點上,一旦出現問題,往往都是非常嚴重的問題。

如何實現

機密管理器概述

根據微軟官方文檔 的描述:

機密管理器工具在開發 ASP.NET Core 項目的過程中存儲敏感數據。 在此上下文中,一段敏感數據是應用程序機密。 應用密鑰存儲在與項目樹不同的位置。 應用程序機密與特定項目關聯或在多個項目之間共享。

在VS2019項目中,選中項目,右鍵,點擊:管理用戶機密(G)菜單,打開用戶機密存儲文件 secrets.json 

 

secrets.json 文件和普通的Json文件沒有區別,他不會主動對存儲的數據進行加密,他的存儲位置和項目位置不一致,因此這個文件不會隨項目文件通過 Git Svn 等代碼管理工具上傳至服務器。

在windows平台下,機密數據的存放位置為(我項目中的機密文件存儲位置):

 選擇項目,編輯項目文件,我們會發現項目文件中<UserSecretsId>節對應的值是 secrets.json 文件存儲的文件夾名稱。它是一個GUID,值可以是任意的,但對應項目是唯一的。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UserSecretsId>fb727eb4-fd16-4383-8187-a299822a3faf</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.5" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.5" />
  </ItemGroup>

</Project>

設置機密

可以通過 .NET Core CLI 工具執行命令來設置機密,列出機密,刪除機密,添加機密,如果沒有安裝 NET Core CLI 工具 ,則可以直接編輯 secrets.json 文件來設置機密,查看機密等操作。

使用.NET Core CLI 工具命令如下(參考自微軟教程:https://docs.microsoft.com/zh-cn/aspnet/core/security/app-secrets?view=aspnetcore-3.1&tabs=windows

設置機密

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

列出機密

 dotnet user-secrets list 

刪除機密

 dotnet user-secrets remove "Movies:ConnectionString" 

清除所有機密

 dotnet user-secrets clear 

在我的VS2019上,個人沒能找到NET Core CLI 工具(如果大家有誰能找到或者有教程安裝,請回復指點),因此,上述命令對我沒有,我采用簡單粗暴的方法直接編輯 secrets.json 文件

例如,增加一個配置項:Movies:ServiceApiKey,並設置值為:123456

{
  "Movies": {
    "ServiceApiKey": "123456",
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

機密管理器為開發者在開發環境下提供了一種保留機密數據的方法,但在開發環境下是不建議使用的。開發環境幾乎無秘密可言....哈哈

上述介紹了機密數據的保存,設置等操作,那么怎么使用這些機密數據呢?

如何訪問機密

1、直接讀取的方式,和配置文件讀取方法一致(請參考我的博客 , 配置文件的讀取:NetCore 配置文件---直接讀取及選項模式讀取

 var _moviesApiKey = ConfigRoot["Movies:ServiceApiKey"];

2、將機密映射到 POCO

將整個對象文本映射到 POCO (帶有屬性的簡單 .NET 類)對於聚合相關屬性十分有用。

假設應用的機密 json文件包含以下兩個機密:

{
  "Movies": {
    "ServiceApiKey": "12345",
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

若要將上述機密映射到 POCO,請使用Configuration API 的對象關系圖綁定功能。 

其實也是我的上篇博客中所說的選項模式,他們幾乎是一致的。

類:

    public class MovieSettings
    {
        public string ConnectionString { get; set; }

        public string ServiceApiKey { get; set; }
    }

讀取方法,請參考博客 :NetCore 配置文件---直接讀取及選項模式讀取

            var moviesConfig = ConfigRoot.GetSection("Movies")
                                .Get<MovieSettings>();
            var  moviesApiKey = moviesConfig.ServiceApiKey;

用機密替換字符串

雖然說機密文件相對安全,但是我們還是有必要針對機密文件存儲的值進行加密,例如Md5、RSA、AES等加密模式。這樣文件是安全的,存儲的內容也是安全加密的。

參考至:在Asp.NET Core中如何優雅的管理用戶機密數據 

及 

參考至:ASP.NET Core 中的開發中安全存儲應用機密

@天才卧龍的博客

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM