背景介紹
在 OWASP(開放式 Web 應用程序安全項目) 2013 年發布的報告中,將不安全的直接對象引用(Insecure Direct Object Reference)標記為 十大 Web 應用程序風險之一, 其表現形式是對象的引用(例如數據庫主鍵)被各種惡意攻擊利用, 所以對于Api返回的各種主鍵外鍵ID, 我們需要進行加密。
.NET Core 的數據保護組件
.NET Core 中內置了一個IDataProtectionProvider接口和一個IDataProtector接口。其中IDataProtectionProvider是創建保護組件的接口,IDataProtector是數據保護的接口。開發人員可以實現這 2 個接口,創建數據保護組件。
內置的數據保護組件
.NET Core 中默認提供了一個數據保護組件, 下面我們來嘗試使用這個默認組件來保護我們的數據。
例: 當前我們有一個Movie類,代碼如下, 我們期望當獲取Movie對象的時候,Id字段是加密的。
public class Movie { public Movie(int id, string title) { Id = id; Title = title; } public int Id { get; set; } public string Title { get; set; } }首先我們需要在Startup.cs中ConfigureService方法中配置使用默認的數據保護組件。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddDataProtection(); }這段代碼會啟用.NET Core默認的數據保護器。
然后我們創建一個MoviesController, 并在構造函數中注入IDataProtectionProvider對象, 然后使用這個Provider對象創建一個實現IDataProtector接口的數據保護器對象
[Route("movies")] public class MoviesController : Controller { private readonly IDataProtector protector; public MoviesController(IDataProtectionProvider provider) { this.protector = provider.CreateProtector("protect_my_query_string"); } }TIPS: 使用Provider創建Protector的時候,我們傳入了一個參數"protect_my_query_string", 這個參數標明了這個保護器的用途,你也可以把它就當成這個保護器的名字。
注意: 不同用途的保護器不能解密對方的加密字符串。, 如果使用了保護器A去解密保護器B生成的字符串,會產生以下異常CryptographicException: The payload was invalid.
然后我們在MovieController中添加2個Api, 一個是獲取所有Movies對象的,一個是獲取指定Movie對象的
[HttpGet] public IActionResult Get() { var model = GetMovies(); var outputModel = model.Select(item => new { Id = this.protector.Protect(item.Id.ToString()), item.Title, item.ReleaseYear, item.Summary }); return Ok(outputModel); } [HttpGet("{id}")] public IActionResult Get(string id) { var orignalId = int.Parse(this.protector.Unprotect(id)); var model = GetMovies(); var outputModel = model.Where(item => item.Id == orignalId); return Ok(outputModel); }
新聞熱點
疑難解答
圖片精選