《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.pswp.cn/news/282986.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282986.shtml
英文地址,請注明出處:http://en.pswp.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.…