千家信息网

ASP.NETCore中数据保护Data Protection的用法是怎样的

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章将为大家详细讲解有关ASP.NETCore中数据保护Data Protection的用法是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
千家信息网最后更新 2025年11月07日ASP.NETCore中数据保护Data Protection的用法是怎样的

这篇文章将为大家详细讲解有关ASP.NETCore中数据保护Data Protection的用法是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。


API 接口

ASP.NET Core Data Protectio 主要对普通开发人员提供了两个接口,IDataProtectionProvider 和 IDataProtector。
我们先看一下这两个接口的关系:

 namespace Microsoft.AspNetCore.DataProtection{ // // 摘要: //  An interface that can provide data protection services. public interface IDataProtector : IDataProtectionProvider {  byte[] Protect(byte[] plaintext);  byte[] Unprotect(byte[] protectedData); }}

可以看到,IDataProtector继承自IDataProtectionProvider ,并且提供了两个方法 Protect 和 Unprotect ,从命名来看,一个是加密,一个是解密。而他们的签名都是传入一个byte数组,这也就意味着他们可以加密和解密一切对象。返回的也是byte数组,也就是说在实际的使用过程中,我们应该自己添加或者使用系统的一些扩展方法来具体化我们的需求。

我们再看一下IDataProtectionProvider接口:

 namespace Microsoft.AspNetCore.DataProtection{ public interface IDataProtectionProvider {  IDataProtector CreateProtector(string purpose); }}

IDataProtectionProvider提供了一个方法,通过传入一个 purpose字符串(见后面详细介绍)来生成一个IDataProtector接口对象。
从这个接口的命名来看,它以Provider结尾,也就是说这部分我们可以实现自己的一套加解密的东西。

我们在阅读微软项目的源代码的时候,经常看一些以xxxxProvider结尾的对象,那么它的职责是什么,同时扮演什么样的角色呢?
其实这是微软专门为ASP.NET设计的一个设计模式,叫Provider Model设计模式,也可以说它是由微软发明的,它不属于23种设计模式中的一种,从功能上来看的话,应该是工厂和策略的结合体。自ASP.NET 2.0开始,微软就开始引入这种设计模式,最开始主要是用于实现应用程序的配置的多个实现。比如开发者最熟悉的web.config中, 针对于数据库连接字符串的配置, 还有二进制,再比如XML啊等等很多,现在其他地方这种模式也用的越来越多起来。

再来说一下CreateProtector方法签名中的 purpose 这个字符串,在上一篇博文中为了读者好理解,我把传入的purpose说成可以理解为一个公钥,其实这个说法是不严谨的,可以理解为一个标识,指示当前Protector的用途。

在使用IDataProtector的时候,会发现它还有一些扩展方法位于Microsoft.AspNetCore.DataProtection命名空间下:

 public static class DataProtectionCommonExtensions{ public static IDataProtector CreateProtector(this IDataProtectionProvider provider, IEnumerable purposes); public static IDataProtector CreateProtector(this IDataProtectionProvider provider, string purpose, params string[] subPurposes); public static IDataProtector GetDataProtector(this IServiceProvider services, IEnumerable purposes); public static IDataProtector GetDataProtector(this IServiceProvider services, string purpose, params string[] subPurposes); public static string Protect(this IDataProtector protector, string plaintext); public static string Unprotect(this IDataProtector protector, string protectedData);}

可以看到,CreateProtector还提供了可以传多个purpose的方法(IEnumerable,params string[]),为什么会有这种需求呢?

其实DataProtector是有层次结构的,再看一下IDataProtector接口,它自身也实现了IDataProtectionProvider接口,就是说IDataProtector自身也可以再创建IDataProtector。

举个例子:我们在做一个消息通讯的系统,在消息通讯的过程中,需要对用户的会话进行加密,我们使用CreateProtector("Security.BearerToken")加密。但是加密的时候并不能保证消息是不受信任的客户端发过来的,所以想到了CreateProtector("username")来进行加密,这个时候假如有一个用户的用户名叫"Security.BearerToken",那么就和另外一个使用Security.BearerToken作为标示的 Protector 冲突了,所以我们可以使用
CreateProtector([ "Security.BearerToken", "User: username" ])这种方式。它相当于
provider.CreateProtector("Security.BearerToken).CreateProtector("User: username")。 意思就是先创建一个Protector叫"Security.BearerToken",然后再在purpose1下创建一个名为"User: username"的Protector。

用户密码哈希

在Microsoft.AspNetCore.Cryptography.KeyDerivation命名空间下提供了一个KeyDerivation.Pbkdf2方法用来对用户密码进行哈希。

具有生命周期限制的加密

有些时候,我们需要一些具有过期或者到期时间的加密字符串,比如一个用户在找回密码的时候,我们向用户的邮箱发送一封带有重置命令的一封邮件,这个重置命令就需要有一个过期时间了,超过这个过期时间后就失效,在以前我们可能需要向数据库存储一个时间来标记发送时间,然后再解密对比和数据库的时间差来验证。

现在我们不需要这么做了,ASP.NET Core 默认提供了一个接口叫 ITimeLimitedDataProtector ,我们先看一下这个接口的定义:

CreateProtector(string purpose) : ITimeLimitedDataProtector This API is similar to the existing IDataProtectionProvider.CreateProtector in that it can be used to create purpose chains from a root time-limited protector.Protect(byte[] plaintext, DateTimeOffset expiration) : byte[]Protect(byte[] plaintext, TimeSpan lifetime) : byte[]Protect(byte[] plaintext) : byte[]Protect(string plaintext, DateTimeOffset expiration) : stringProtect(string plaintext, TimeSpan lifetime) : stringProtect(string plaintext) : string

ITimeLimitedDataProtector提供了数个重载方法用来设定带有生命周期的加密方法,用户可以通过Date TimeOffset,TimeSpan等参数来设置时间。

有对应的加密,就有相对应的解密方法,在这里就不详细介绍了。有兴趣的同学可以去看一下官方文档。

配置数据保护

在我们的 ASP.NET Core 运行的时候,系统会基于当前机器的运行环境默认配置一些关于 Data Protection 的东西,但是有些时候可能需要对这些配置做一些改变,比如在分布式部署的时候,在上一篇博文的末尾也提到过,下面就来看一下具体怎么配置的吧。

上篇文章已经提到过,我们通过以下方式来把 Data Protection 注册到服务中:

 public void ConfigureServices(IServiceCollection services){ services.AddDataProtection();}

其中AddDataProtection 返回的是一个 IDataProtectionBuilder 接口,这个接口提供了一个扩展方法PersistKeysToFileSystem() 来存储私钥。可以通过它传入一个路径来指定私钥存储的位置:

 public void ConfigureServices(IServiceCollection services){ services.AddDataProtection()  .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));}

可以传入一个共享文件夹,来存储私钥,这样在不同机器的私钥就可以保存到一个位置了。可以通过此种方式在分布式部署的时候,隔离开了机器的差异化。
如果你觉得不安全,还可以配置一个X.509证书来,进行加密:

 public void ConfigureServices(IServiceCollection services){ services.AddDataProtection()  .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))  .ProtectKeysWithCertificate("thumbprint");}

上篇文章讲过,Data Protection 的默认保存时间是90天,你可以通过以下方式来修改默认的保存时间:

 public void ConfigureServices(IServiceCollection services){ services.AddDataProtection()  .SetDefaultKeyLifetime(TimeSpan.FromDays(14));}

默认情况下,即使使用相同的物理密钥库,Data Protection 也会把不同的应用程序隔离开,因为这样可以防止从一个应用程序获取另外一个应用程序的密钥。所以如果是相同的应用程序,可以设置相同的应用程序名称:

 public void ConfigureServices(IServiceCollection services){ services.AddDataProtection()  .SetApplicationName("my application");}

有时候需要禁用应用程序生成密钥,或者是说我只有一个程序用来生成或者管理密钥,其他程序只是负责读的话,那么可以这样:

 public void ConfigureServices(IServiceCollection services){ services.AddDataProtection()  .DisableAutomaticKeyGeneration();}

修改加密算法

可以使用UseCryptographicAlgorithms方法来修改ASP.NET Core Data Protection的默认加密算法,如下:

 services.AddDataProtection() .UseCryptographicAlgorithms(new AuthenticatedEncryptionSettings() {  EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,  ValidationAlgorithm = ValidationAlgorithm.HMACSHA256 });

关于ASP.NETCore中数据保护Data Protection的用法是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

加密 接口 方法 时候 时间 程序 用户 应用程序 应用 配置 数据 模式 设计 可以通过 字符 字符串 密钥 文章 方式 设计模式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 珠海pc软件开发哪家好 网络安全问题及其应对论文 幼儿园开展网络安全教育信息 镇江云主机服务器安装 软件开发 加班情况 中国电信网络安全惠民生 台州数据库防护 一个服务器电源能带两个主板吗 郎溪自动化软件开发服务解决方案 汇聚年轻力量共建网络安全作文 求生之路药抗服务器怎么找 学校信息网络安全自查报告 门户网络安全专业就业情况 数据库技术在社会生活中 聚类算法连接数据库 游卡网络安全怎么转让 字牌软件开发公司 华三服务器外部健康灯闪烁 高防服务器如何进行安全防御 在交换机上做数据库镜像 中学第二季度安全数据库 联通服务器怎么不卡顿 数据库微软有什么软件 泰国美国网络安全计划 互联网科技行业赞助 浪潮服务器内存电脑能用吗 工信部信息网络安全员培训 世界启动器如何进服务器 如何找到穿越火线手游的服务器 澳门天驱企业级服务器云空间
0