首页 > 编程 > .NET > 正文

详解.NET Core中的数据保护组件

2024-07-10 12:48:43
字体:
来源:转载
供稿:网友

背景介绍

在 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); }            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表