架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 685|回复: 0

[资料] ASP.NET Core(二十二)基于 IDataProtectionProvider 数据保护

[复制链接]
发表于 2023-8-15 10:21:16 | 显示全部楼层 |阅读模式
需求:开发过程中,经常可能遇到一些加解密的场景,例如:邮箱认证可以携带一个加密的字符串,当用户点击链接跳转到接口后,系统可以正常解密字符串内容,从而实现邮箱认证功能。

使用 powershell 生成 <machineKey> 元素
https://www.itsvse.com/thread-10644-1-1.html

使用 ASP.NET machineKey 加密数据
https://www.itsvse.com/thread-9535-1-1.html

ASP.NET machineKey的作用和使用方法
https://www.itsvse.com/thread-2705-1-1.html

ASP.NET Core 提供了数据保护功能:https://learn.microsoft.com/zh-cn/aspnet/core/security/data-protection/introduction

主要的 Package

Data Protection 涉及到的主要 Package 如下,根据需要引用:

  • Microsoft.AspNetCore.DataProtection.Abstractions 标准的.NET CORE抽象层组件包命名方式。包含 IDataProtectionProvider、IDataProtector 等主要的接口服务。
  • Microsoft.AspNetCore.DataProtection 上一个抽象包的具体实现包,包括核心加密操作、密钥管理、配置和扩展性。
  • Microsoft.AspNetCore.DataProtection.Extensions 扩展包。提供了创建实例的工厂方法、密钥的存储扩展方法。在非DI模式下会用到这个包。
  • Microsoft.AspNetCore.DataProtection.SystemWeb 实现对ASP.NET4.x中的<machineKey>加解密机制的兼容。
  • Microsoft.AspNetCore.Cryptography.KeyDerivation 提供 PBKDF2 密码哈希例程的实现。在需要使用Hash加密的时候使用。


IDataProtectionProvider vs IDataProtector

IDataProtectionProvider 看名字可知是基于微软的Provider模式,用于提供创建实例的策略。通过调用 IDataProtectionProvider.CreateProtector(purpose) 方法创建 IDataProtector 对象。
IDataProtector 则是负责加解密的服务,它主要提供了protect、Unprotect两类方法(每类都有很多重载和扩展方法)。简单理解即 protect 用于加密,unprotect用于解密。
IDataProtectionProvider的Create方法参数是一个字符串,用于提供隔离性功能。通过不通的字符串创建的 IDataProtector 即使对同一个对象加密,得到的加密结果也是不同的。同时 IDataProtector 本身也是隐式的IDataProtectionProvider,同样提供的 CreateProtector(purpose) 方法。这意味着可以方便的实现多租户应用模式

QQ截图20230815094949.jpg

这里有几个注意点:

IDataProtectionProvider、IDataProtector的实例都是线程安全的。
unprotect方法是通过抛出异常的方式来告知调用者解密失败。异常类为 CryptographicException。

ASP.NET Core 简单使用数据保护

新增一个接口,来实现数据加密和解密,代码如下:

测试如下:

QQ截图20230815094444.jpg

IDataProtectionProvider 是单例模式,代码如下:https://source.dot.net/#Microsoft.AspNetCore.DataProtection/DataProtectionServiceCollectionExtensions.cs

QQ截图20230815095342.jpg

密钥管理

如果用户配置文件可用,密钥将保留到 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 文件夹中。如果操作系统是 Windows,则使用 DPAPI 对密钥进行静态加密。如下图:

QQ截图20230815095629.jpg

钥匙寿命

默认情况下,密钥的生命周期为 90 天。当密钥过期时,应用程序会自动生成新密钥并将新密钥设置为活动密钥。只要已停用的密钥保留在系统上,您的应用程序就可以解密受它们保护的任何数据。有关详细信息,请参阅密钥管理。https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-management

默认算法

使用的默认负载保护算法是 AES-256-CBC(用于保密)和 HMACSHA256(用于真实性)。每 90 天更改一次的 512 位主密钥用于根据每个有效负载派生用于这些算法的两个子密钥。

ASP.NET Core 中的密钥存储提供程序

文件系统:PersistKeysToFileSystem
Azure 存储:PersistKeysToAzureBlobStorage,需要引用:Azure.Extensions.AspNetCore.DataProtection.Blobs
Redis 存储:PersistKeysToStackExchangeRedis,需要引用:Microsoft.AspNetCore.DataProtection.StackExchangeRedis

参考:https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-storage-providers

集群和分布式

在集群或者分布式中,需要实现共享 Cookie、CSRF 等功能,都是基于 IDataProtector 数据保护来加解密的,如果服务器的密钥不一致,例如:A 服务器加密,B 服务器解密,就会抛出异常(如下图),这时,就需要部署相同的密钥。

QQ截图20230815100647.jpg

配置相同密钥如下:

程序运行后,会在 publish_itsvse 文件夹下面自动生成 key-*.xml 密钥文件,将此文件在不同服务器下面保持一致即可!如下图:

QQ截图20230815101644.jpg

ASP.NET Core 保护配置

ASP.NET CORE 提供了丰富的Api支持密码持久化配置和自定义功能。

  • PersistKeysToAzureBlobStorage、ProtectKeysWithAzureKeyVault。Azure云存储方案。
  • PersistKeysToFileSystem。本地文件系统存储方案,记录了加密算法、密钥以及依赖项。
  • ProtectKeysWith*。通过该命名方式的扩展提供加密方式。例如 ProtectKeysWithCertificate
  • SetDefaultKeyLifetime。 设置密钥生存周期,默认为90天。
  • SetApplicationName。设置应用名。默认情况下数据保护机制对各个应用是绝对隔离的。通过设置相同的应用名可以实现应用之间的密钥共享。
  • DisableAutomaticKeyGeneration。禁止密钥自动回滚。很多时候我们其实不希望密码发生变化或是在一个集群服务中,我们有专门的一台服务负责密钥的更新回滚,其他负载只要从共享的地方获取就好了。
  • UseCryptographicAlgorithms。使用自定义的加解密算法


参考:https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-management





上一篇:使用 powershell 生成 &lt;machineKey&gt; 元素
下一篇:异地组网方案比较Tailscale、ZeroTier、WireGuard、OmniEdge 和 Ngrok
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-27 19:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表