iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
佛心分享-IT 人自學之術

靠近 ASP .NET Core 一點點系列 第 17

Day 17 ASP.NET Core Data Protection : 資料保護

  • 分享至 

  • xImage
  •  

分享主軸

  • ASP.NET Core Data Protection 是什麼 ?
  • 快速實作 ASP.NET Core Data Protection

ASP.NET Core Data Protection

是一套簡易加解密的機制,替代了 ASP.NET 1.x 到 4.x 中的 元素

設計原理

  • 加密和解密:使用對稱加密技術(如AES-256-CBC),確保只有授權的應用程序能夠讀取和寫入

  • 密鑰管理:自動處理密鑰的生成、存儲和輪換,開發者無需手動管理密鑰

  • 防篡改:確保數據在傳輸過程中未被修改,

  • 隔離:即使在同一主機上運行多個應用程序,數據保護系統也能確保這些應用程序之間的數據隔離

優點

  • 簡單易用
    提供了易於使用的API,開發者可以快速上手,無需深入了解底層的加密算法和密鑰管理

  • 自動密鑰管理
    系統自動處理密鑰的生成、存儲和輪換,減少了開發者的負擔。密鑰會定期更新(默認每90天)

  • 隔離
    使用用途字符串(purpose strings)來隔離不同用途的資料保護操作,確保不同用途的資料不會互相干擾

官方文件有說到 :
The data protection APIs aren't primarily intended for indefinite persistence of confidential payloads. Other technologies, such as Windows CNG DPAPI and Azure Rights Management are more suited to the scenario of indefinite storage. They have correspondingly strong key management capabilities. That said, the ASP.NET Core data protection APIs can be used for long-term protection of confidential data.

對於長期保存機密資料的方式有更好的技術,如 Windows CNG DPAPI 或是 Azure Rights Management,但是如果要使用也是可以的


只是這套機制對於在資料長期存取情境下以及密鑰這塊,就需要特別討論如何管理配置

實作

Program.cs 註冊

builder.Services.AddDataProtection();

使用到的地方

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IDataProtector _protector;

        public HomeController(ILogger<HomeController> logger, IDataProtectionProvider protector)
        {
            _logger = logger;
            // 指定一個用途字符串(purpose string)來隔離不同用途的資料保護 (如上說到的,隔離功能)
            _protector = protector.CreateProtector("demov1.0");
        }

        public IActionResult Index()
        {
            // 加密
            string originalData = "Sensitive data";
            string protectedData = _protector.Protect(originalData);

            // 解密
            string unprotectedData = _protector.Unprotect(protectedData);

            ViewData["EncryptEext"] = protectedData;
            ViewData["DecryptEext"] = unprotectedData;

            return View();
        }

結果

https://ithelp.ithome.com.tw/upload/images/20240930/20133954uYnJ97jRSQ.png

其他設定

將金鑰指定到特定位置
多個應用程式之間共用機器金鑰

builder.Services.AddDataProtection()
                .PersistKeysToFileSystem(new DirectoryInfo(@"C:\keys")) // 設定密鑰存儲位置
                .SetApplicationName("MyApp"); // 設定應用程序名稱以隔離密鑰

如上詳細設定請見文章

https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-management?view=aspnetcore-8.0&WT.mc_id=DT-MVP-4015686

https://stackoverflow.com/questions/47693057/dataprotection-share-machine-key-between-multiple-applications

今日結語

之前專案上聽同事討論了這個有趣的東西,剛好前陣子也有使用到,雖然都是初步的,多認識一種機制,而且使用起來也很方便快速,真的很棒呢!
只是有些注意地方,還得深入研究才會更加了解!

今日就分享到這,明天繼續囉,加油 ~~

參考文章

https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/introduction?view=aspnetcore-8.0&WT.mc_id=DT-MVP-4015686

https://andrewlock.net/an-introduction-to-the-data-protection-system-in-asp-net-core/


上一篇
Day 16 Identity : 認證與授權
下一篇
Day 18 JWT:ASP.NET Core 驗證機制之一
系列文
靠近 ASP .NET Core 一點點27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言