《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…

jsp 连接access数据库

参考笔记&#xff1a;https://www.cnblogs.com/mthoutai/p/7278995.html

关于 MySQL 的 boolean 和 tinyint(1)

boolean类型MYSQL保存BOOLEAN值时用1代表TRUE,0代表FALSE&#xff0c;boolean在MySQL里的类型为tinyint(1),MySQL里有四个常量&#xff1a;true,false,TRUE,FALSE,它们分别代表1,0,1,0&#xff0c;mysql> select true,false,TRUE,FALSE;--------------------------| TRUE | …

java jtable defaulttablemodel_java – JTable和DefaultTableModel

我有一个表从我的本地MySQL服务器获取信息.它很好地读取数据并将其发布在GUI上.我的问题是,当我更改table命令时,如何刷新表格,例如&#xff1a;private String sql "select * from profildb.tbl_detailed"; //toprivate String sql "select * from profildb.…

捕获 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…

php判断是否是文件_PHP判断文件是否为图片文件的方法总结

近日在做图片处理方面的开发&#xff0c;看着这一片不错的文章&#xff0c;分享给大家。在网页设计中&#xff0c;如果需要图片&#xff0c;我们通常拿到的是一个图片的文件名。仅仅通过文件名是无法判断该文件是否是一个图片文件的。或许有的人以为通过后缀名就可以判断&#…

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

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

oracle 基本异常的练习及各个错误码

DECLAREv_deptno emp.deptno%TYPE :&deptno;v_sal emp.sal%TYPE;v_empno emp.empno%TYPE; BEGINSELECT sal INTO v_sal FROM emp WHERE deptno v_deptno;IF v_sal<1500 THEN UPDATE emp SET salsal100 WHERE empno v_empno; DBMS_OUTPUT.PUT_LINE(编码为||v_empno…

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

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

tomcat 插件

1. http://www.eclipsetotale.com/tomcatPlugin.html

PHP使用for循环打出星号表格,console - JavaScript中,使用for循环输出如下图形(等腰三角形,和平行四边形)?原理是啥?...

小皮2017-04-11 13:13:591楼以下代码用了ES6,取名比较随意s就是space,空格的意思,n是要总次数,第二个参数是输出的图形第一个很简单,累加就好了//ES6function first(n,print "*"){for(let i 0; i < n ;i)console.log(i > 0 ? print.repeat(i 1) : print);}…

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

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

WeakHashMap和Java引用类型详细解析

WeakHashMap是种弱引用的HashMap&#xff0c;这是说&#xff0c;WeakHashMap里的key值如果没有外部强引用&#xff0c;在垃圾回收之后&#xff0c;WeakHashMap的对应内容也会被移除掉。 1.1 Java的引用类型 在讲解WeakHashMap之前&#xff0c;我们需要了解Java中引用的相关类&…

KVOController代码分析和踩坑

KVOController是FaceBook的一个开源库&#xff0c;提供了方便的姿势让你去使用KVO。 github.com/facebook/KV… 大概的用法如下&#xff1a; [self.KVOController observe:target keyPath:keyPath options:NSKeyValueObservingOptionNew block:^(id observer, id object, NSDic…

java中compareto方法详解,Java中compareTo()方法的详解

例如&#xff1a;String a "abc";String b "abc";System.out.println("num "a.compareTo(b));a是String类型的字符串,它的比较用compareTo方法,它从第一位开始比较, 如果遇到不同的字符,则马上返回这两个字符的ascii值差值.返回值是int类型1.…