《ASP.NET Core 6框架揭秘》实例演示[20]:“数据保护”框架基于文件的密钥存储...

《数据加解密与哈希》演示了“数据保护”框架如何用来对数据进行加解密,而“数据保护”框架的核心是“密钥管理”。数据保护框架以XML的形式来存储密钥,默认的IKeyManager实现类型为XmlKeyManager。接下来我们通过模拟代码和实例演示的形式来介绍一下XmlKeyManager对象针对密钥的创建、撤销和回收的实现原理。[本文节选《ASP.NET Core 6框架揭秘》第13章]

[S1308]基于本地文件系统的密钥管理(密钥创建)(源代码)
[S1309]基于本地文件系统的密钥管理(密钥撤销)(源代码)

[S1308]基于本地文件系统的密钥管理(密钥创建)

接下来我们通过如下这个简单的演示实例来看看创建出来的密钥对应的XML具有怎样的结构。如代码片段所示,我们通过依赖注入容器得到IKeyManager对象,并用它创建了三个密钥。在调用AddDataProtection扩展方法后,我们调用返回IDataProtectionBuilder对象的PersistKeysToFileSystem扩展方法,其目的是利用FileSystemXmlRepository对象将代表创建密钥和密钥撤销操作的XML存储在指定的目录(“c:\keys”)下。

using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.Extensions.DependencyInjection;var directory = "c:\\keys";
var services = new ServiceCollection();
services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(directory));
var keyManager = services.BuildServiceProvider().GetRequiredService<IKeyManager>();var key1 = keyManager.CreateNewKey(DateTimeOffset.Now, DateTimeOffset.Now.AddDays(1));
var key2 = keyManager.CreateNewKey(DateTimeOffset.Now ,DateTimeOffset.Now.AddDays(2));
var key3 = keyManager.CreateNewKey(DateTimeOffset.Now, DateTimeOffset.Now.AddDays(3));Console.WriteLine(key1.KeyId);
Console.WriteLine(key2.KeyId);

演示程序运行后会将创建的三个密钥的ID以如图1的形式输出到控制台上。与此同时,目录“c:\keys\”下会出现三个对应的XML文件。从图中可以看出,表示密钥文件的名称正是调用IXmlRepository对象的StoreElement方法时指定的名称。

ecaefec0181ca5610f1701d26f320789.png
图1 以XML文件存储的密钥

如下所示的是其中一个密钥对应的XML文件的内容。通过IAuthenticatedEncryptorDescriptor对象导出的XML体现在<key>/<descriptor>节点上。可以看出当前环境下默认采用的加密和哈希算法分别是AES_256_CBC和HMACSHA256,AuthenticatedEncryptorDescriptorDeserializer为采用的反序列化器类型。

<?xml version="1.0" encoding="utf-8"?>
<key id="3f8769f0-78c8-42f2-9f13-102d83bb298c" version="1"><creationDate>2022-03-12T09:47:38.4677311Z</creationDate><activationDate>2022-03-12T17:47:38.4630578+08:00</activationDate><expirationDate>2022-03-13T17:47:38.4674829+08:00</expirationDate><descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"><descriptor><encryption algorithm="AES_256_CBC" /><validation algorithm="HMACSHA256" /><masterKey p4:requiresEncryption="true" xmlns:p4="http://schemas.asp.net/2015/03/dataProtection"><!-- Warning: the key below is in an unencrypted form. --><value>oFjUpRP4cKwp0QQctjibDN8QK3m76uQAlkGZ1V4E5sb9l9Yn4zzgjHyxpoJ7qENqBGwdD0A11U90YzGRb53p+g==</value></masterKey></descriptor></descriptor>
</key>

[S1309]基于本地文件系统的密钥管理(密钥撤销)

我们接着来看看密钥的撤销。如果是针对单个密钥的撤销,该密钥的ID会通过名为“key”的子元素保存下来。如果需要撤销现有的所有密钥,这个key元素的值会设置为“*”。两者采用的文件名称也不相同,格式分别为“revocation-{KeyId}”和“revocation-{RevocationDate}”。我们接下来演示针对密钥的撤销。如下面的代码片段所示,在得到IKeyManager对象之后,我们调用其GetAllKeys方法得到所有密钥。在调用RevokeKey方法撤销第一个得到密钥之后,我们调用RevokeAllKeys方法将现有密钥全部撤销掉。

using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.Extensions.DependencyInjection;var directory = "c:\\keys";
var services = new ServiceCollection();
services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(directory));
var keyManager = services.BuildServiceProvider().GetRequiredService<IKeyManager>();var key = keyManager.GetAllKeys().First();
keyManager.RevokeKey(key.KeyId);
keyManager.RevokeAllKeys(DateTimeOffset.Now, "Revocation Test");

演示程序执行后会在密钥存储目录(c:\keys\)下生成两个名称前缀为“revocation-”的XML文件。与上面的代码进行比较,我们会发现XML文件的名称依然是调用IXmlRepository对象的StoreElement方法指定的名称。

d9655e0ef471b5fa4a60d9dc04eb6718.png
图2 描述密钥撤销的XML文件

如下所示的是这两个描述密钥撤销的XML文件的内容,可以看出XML结构与前面提供的RevokeKey和RevokeAllKeys方法的定义是匹配的。

revocation-184d9274-78f1-4352-bbed-1d0d6803ddad.xml

<?xml version="1.0" encoding="utf-8"?>
<revocation version="1"><revocationDate>2022-03-12T09:54:48.1157691Z</revocationDate><key id="184d9274-78f1-4352-bbed-1d0d6803ddad" /><reason />
</revocation>

revocation-20220312T0954481194781Z.xml

<?xml version="1.0" encoding="utf-8"?>
<revocation version="1"><revocationDate>2022-03-12T17:54:48.1194781+08:00</revocationDate><!-- All keys created before the revocation date are revoked. --><key id="*" /><reason>Revocation Test</reason>
</revocation>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用msui的回到顶部的一个小问题

2019独角兽企业重金招聘Python工程师标准>>> 回到顶部&#xff0c;一直没反应。 zepto加了动画后&#xff0c;依然如此。原生写法&#xff0c;jquery写法&#xff0c;仍然没有反应。 排查了后&#xff0c;发现获取的对象错误。手机端上&#xff0c;滚动到顶部&#…

口袋精灵加速版java_口袋妖怪TCG!口袋对决加速版教程(免ROOT)

原标题&#xff1a;口袋妖怪TCG&#xff01;口袋对决加速版教程(免ROOT)《口袋对决》是一款以口袋精灵对战为核心玩法的集换式卡牌游戏&#xff0c;原汁原味的口袋画风&#xff0c;丰富多彩的各系精灵&#xff0c;策略竞技的属性相克。在5分钟一局的卡牌对战中&#xff0c;你将…

C#发布程序添加其他程序文件

注&#xff1a;程序发布文件&#xff0c;默认只发布自身程序直接引用的相关文件(A程序)。 如果需要添加其他程序(不同的应用程序B)文件&#xff0c;操作方法如下&#xff1a; 第一步&#xff1a;将B程序文件复制到A程序 第二步&#xff1a;将B程序文件右键--》属性做如下更改&a…

k8s 读书笔记 - 初始化容器 Init Container

Init Container 概述Init Container&#xff08;Init 容器&#xff09; 是一种特殊容器&#xff0c;在 Pod 内的应用容器启动之前运行&#xff0c;执行相关的初始化操作。Init 容器可以包括一些应用镜像中不存在的 实用工具 和 安装脚本 。每个 Pod 中可以包含一个或多个容器&a…

捕获 BackgroundService 中的异常 | 学学官方是如何实现的

前言上次&#xff0c;我们实现了《使用“装饰者模式”捕获 BackgroundService 中的异常》。结果发现&#xff0c;微软已经发现了这个问题&#xff0c;并在 .NET 6 中解决了。&#xff08;囧&#xff09;让我们验证一下&#xff1a;using IHost host Host.CreateDefaultBuilder…

使用badboy录制脚本 结合Jmeter一起测试。

1.badboy介绍 Badboy是一款不错的Web自动化测试工具&#xff0c;如果你将它用于非商业用途&#xff0c;或者用于商业用途安装Badboy 的机器数量不超过5台&#xff0c;你是不需要为它支付任何费用的。Badboy提供了将Web测试脚本直接导出生成JMeter 脚本的功能&#xff0c;并且这…

centOS下安装jdk1.8

2019独角兽企业重金招聘Python工程师标准>>> 本文记录了在vm下安装的centOS7下安装jdk1.8的过程 需要的工具及jdk&#xff1a; jdk-8u171-linux-x64.tar.gz 可以到官网去下 cecureFX 用于文件的传输 过程&#xff1a; 本次centOS7使用VMware Workstation 14 P…

盘点大厂的那些开源项目 - 滴滴出行

滴滴出行是涵盖出租车、 专车、滴滴快车、 顺风车、代驾及大巴、货运等多项业务在内的一站式出行平台。Nightingale 夜莺分类&#xff1a;监控系统夜莺是一套分布式高可用的运维监控系统&#xff0c;最大的特点是混合云支持&#xff0c;既可以支持传统物理机虚拟机的场景&#…

阿里巴巴发布智能运维故障管理AI+生态计划

摘要&#xff1a; 为响应马老师“家国情怀&#xff0c;世界担当”的号召&#xff0c;开放“AI”生态计划&#xff0c;将让集团内部服务过程中积累下的技术与经验更好地回馈社会&#xff0c;任何企业或合作伙伴均可以简单方便的接入阿里巴巴智能故障管理平台&#xff0c;通过对接…

k8s 读书笔记 - Pod 的升级和回滚

Pod 升级可能面临的问题当集群中的某个服务需要升级时&#xff0c;我们需要停止目前与该服务相关的所有 Pod&#xff0c;然后下载新版本镜像并创建新的 Pod。但是当集群规模比较庞大时&#xff0c;那么这个工作就会变成一个挑战&#xff0c;而且先全部停止然后再逐步升级的方式…

《ASP.NET Core 6框架揭秘》实例演示[21]:如何承载你的后台服务

借助 .NET提供的服务承载&#xff08;Hosting&#xff09;系统&#xff0c;我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载&#xff0c;ASP.NET Core应用最终也体现为这…

使用DBCA工具创建自己的数据库

ylbtech-Oracle&#xff1a;使用DBCA工具创建自己的数据库 DBCA创建数据库 默认安装的Oracle数据库一般不能满足实际应用的需求&#xff0c;例如数据库名称、数据库块的大小等都需要修改&#xff0c;那么我们应该自己创建一个满足实际应用系统需要的Oracle数据实例&#xff08;…

免去架构算法调优,如何让你的系统风驰电掣?|图说

通用计算场景下的云服务器领域从来都是兵家必争之地&#xff0c;价格战曾打了一波又一波&#xff0c;可用户痛点却依然是“顽疾”。由于采用的基础硬件、架构和调优技术千差万别&#xff0c;类似配置的云服务器之间存有较大的性能差异。 但市面上五花八门的云服务器不绝于耳&am…

记一次 .NET 某数控机床控制程序 卡死分析

一&#xff1a;背景 1. 讲故事前段时间有位朋友微信上找到我&#xff0c;说它的程序出现了卡死&#xff0c;让我帮忙看下是怎么回事&#xff1f; 说来也奇怪&#xff0c;那段时间求助卡死类的dump特别多&#xff0c;被迫训练了一下对这类问题的洞察力 &#x1f604;&#x1f60…

ASP.NETCoreWeb开发之OptionsPattern

这节我们来讲一下&#xff0c;在ASP.NET Core Web开发中&#xff0c;读取配置文件信息的新方式&#xff1a;Options。前言 /Options在ASP.NET Web框架中&#xff0c;我们读取配置文件中的数据&#xff0c;在不使用第三方框架的情况下&#xff0c;可能需要通过ConfigurationMana…

SpringMVC执行流程图

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/2607324/blog/827946

CentOS 7系统安装配置图解教程

操作系统&#xff1a;CentOS 7.3 备注&#xff1a; CentOS 7.x系列只有64位系统&#xff0c;没有32位。生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 一、安装CentOS 7.3 成功引导系统后&#xff0c;会出现下面的界面 界面说明&#xff1a; Install CentOS 7 #安装…

这份《.NET/C#面试手册》超神啦!

这几天给.neter们整理了一份《.NET/C#面试手册》&#xff0c;目前大约4万字左右&#xff0c;初衷也很简单&#xff0c;就是希望在面试的时候能够帮助到大家&#xff0c;减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点&#xff0c;就当是查缺补漏&#…

Dinic算法----最大流常用算法之一

——没有什么是一个BFS或一个DFS解决不了的&#xff1b;如果有&#xff0c;那就两个一起。 最大流的$EK$算法虽然简单&#xff0c;但时间复杂度是$O(nm^2)$&#xff0c;在竞赛中不太常用。 竞赛中常用的$Dinic$算法和$SAP$&#xff0c;其实也不太难。 那么&#xff0c;$Dinic$算…

javascript学习笔记 null和undefined

null是javascript语言的关键字&#xff0c;它表示一个特殊值&#xff0c;常用来描述“空值”。对null执行typeof预算&#xff0c;结果返回字符串“object”&#xff0c;也就是说&#xff0c;可以将null认为是一个特殊的对象值&#xff0c;含义是“非对象”。但实际上&#xff0…