.NET6之MiniAPI(十六):数据保护

对于web,安全是一个永久的话题,所以ASP.NET Core数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换。

ASP.NET Core的数据保护是根据本机的一个key来生成加密码,然后再用这个key来解密,如果key不一样,解密失败。默认情况下这个key的有效期是90天,当然这个值是可以被改变的。

默认数据保护key存放的位置,C:\Users\用户\AppData\Local\ASP.NET\DataProtection-Keys,如:key-a2b3132b-444b-4cfa-8530-922b7e991cd9.xml,是一个xml文件,里面记录了这个key的一些信息,创建时间,激活时间,过期时间,和加解密数据所用的命名空间,加密方式等信息,如下:

<?xml version="1.0" encoding="utf-8"?>
<key id="a2b3132b-444b-4cfa-8530-922b7e991cd9" version="1"><creationDate>2022-02-10T13:41:14.7492868Z</creationDate><activationDate>2022-02-10T13:41:14.7421157Z</activationDate><expirationDate>2022-05-11T13:41:14.7421157Z</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" /><encryptedSecret decryptorType="Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60" xmlns="http://schemas.asp.net/2015/03/dataProtection"><encryptedKey xmlns=""><!-- This key is encrypted with Windows DPAPI. --><value>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAAZeuIp6hZUGsfTgUuNoSSAAAAAACAAAAAAAQZgAAAAEAACAAAACpVhXOBzCWDrZmD13HwR6U3qHk7O2Pki1vPEBrtOJlrQAAAAAOgAAAAAIAACAAAAAPc2zwN10L4IVtN7tFsdQV0Cx7giHlNrWI6heArHHFt1ABAAACCCC8BhZwQ32ZZ67nBEi/tZS+HagViuS/xYtlUJOfzkJOmWg28KkBR2vM6Jo1Y1OY/AbIx6EhbGvZUkdL9aeGBy6A0GBS/3VC4/X8KV3sihRPhb1n924slVds0Y9p7J3p6sCLbhvh0ohhBe1pAENr1XkUnd2Ve4JQ0gVVgQ7vFJOonGGXGQ52dzmITzkJLYIqwNtksA31OmJUlJG7KJnrDEofKjQynvj9gXnOVnMpfHNk6v8v96WDlK7n9Ax3o/W238E7FtOVBKTNoIFWwyc40MR25IrkQdtMZ7HrODY1VRL9nuuexbVXq+5mt5QOyVgvZ1RK0sCwaBB3FSHwKmjskk+WpHXZpi3hjLx82F1gCpatSma01zDEDte0LZHRG9pVYgUXRwUaXX3G0uPuI2mXNpN57qIGZhCJC37cACIzJQ5NxuS+n9Rs6SjVykn78LBAAAAAkxOreUFzysrk5EeldARfOulsq/9OT2w/AFU9sRvPWgZPOieKcdAfIuNF09FgcyquX6IcNuydPn46Uy+saHia0w==</value></encryptedKey></encryptedSecret></descriptor></descriptor>
</key>

使用数据保护的代码也很简单,注入DataProtection服务就可以,只需要使用服务时,通过IDataProtectionProvider创建一个数据保护对象,在创建时可以添加目标字符串参数,来防隔离不同的目标字符串加密的数据,所以key和这个目标字符串都能起到隔离作用。

using Microsoft.AspNetCore.DataProtection;var builder = WebApplication.CreateBuilder(args);
//通过SetDefaultKeyLifetime更改默认值90天
builder.Services.AddDataProtection().SetDefaultKeyLifetime(TimeSpan.FromDays(10));
var app = builder.Build();app.MapGet("/encrypt/{str}", (IDataProtectionProvider provider, ILogger<Program> logger, string str) =>
{var protector = provider.CreateProtector("a.b.c");var sec = protector.Protect(str);logger.LogInformation(sec);return "加密:" + sec;
});
app.MapGet("/decrypt/{sec}", (IDataProtectionProvider provider, ILogger<Program> logger, string sec) =>
{var protector = provider.CreateProtector("a.b.c");var str = protector.Unprotect(sec);logger.LogInformation(str);return "解密:" + str;
});app.Run();

上面代码只是实现了单机部署,如果集群部署,比如k8s中的不同pod,生成的key分别保存在自己的pod里,那么外部访问又是随机分配的,这时就会频繁出现解密失败的情况,这就要集中管理key了,用redis或数据库都可以,这里用到的是SqlServer,首先创建存key的表,如下:

CREATE TABLE [dbo].[DataProtectionKeys1]([ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY ,[FriendlyName] [varchar](64) NULL,[Xml] [text] NULL)

当有key保存进来时的结果如下:

31e27278a1f15db89e6cd91638b5d12d.png

其中字段key存的值如下,与本地文件存储的是一样的。

<key id="a32def14-9156-4c5e-946c-d3aa5b1a1743" version="1"> <creationDate>2022-02-10T14:20:37.5680295Z</creationDate>  <activationDate>2022-02-10T14:20:36.5853181Z</activationDate>  <expirationDate>2022-05-11T14:20:36.5853181Z</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 xmlns:p4="http://schemas.asp.net/2015/03/dataProtection" p4:requiresEncryption="true">  <!-- Warning: the key below is in an unencrypted form. -->  <value>gO70+leJQM8NJopS5VmMy+qkz0j+I9diBoCnxkqGxpqdXmyTULgAhMyu+3S4SJ0vjsx8Hxc+d/ipUgDBnkuQNw==</value> </masterKey> </descriptor> </descriptor> 
</key>

这时,代码需要支持EF,所以引入如下NuGet包

Microsoft.AspNetCore.DataProtection Microsoft.AspNetCore.DataProtection.EntityFrameworkCore Microsoft.EntityFrameworkCore 

Microsoft.EntityFrameworkCore.SqlServer

代码要换成EF方式持久化key,要注入EF的Context,然后注入数据保护对象时指明持久化的方式:

using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;var builder = WebApplication.CreateBuilder(args);builder.Services.AddDbContext<DataProtContext>(options =>options.UseSqlServer(builder.Configuration.GetConnectionString("DataProtDB")));
builder.Services.AddDataProtection().PersistKeysToDbContext<DataProtContext>();
var app = builder.Build();app.MapGet("/encrypt/{str}", (IDataProtectionProvider provider, ILogger<Program> logger, string str) =>
{var protector = provider.CreateProtector("a.b.c");var sec = protector.Protect(str);logger.LogInformation(sec);return "加密:" + sec;
});
app.MapGet("/decrypt/{sec}", (IDataProtectionProvider provider, ILogger<Program> logger, string sec) =>
{var protector = provider.CreateProtector("a.b.c");var str = protector.Unprotect(sec);logger.LogInformation(str);return "解密:" + str;
});app.Run();class DataProtContext : DbContext, IDataProtectionKeyContext
{public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }public DataProtContext(DbContextOptions<DataProtContext> options): base(options){}
}

加密结果:

c69c83f65f87264fdb7f0c1c0397da5b.png

解密结果:

a81571fff5b551eb51d3cce783c612ef.png

如果生成的加密串需要时效性,需要把生成的Protector转成TimeLimitedDataProtector来加解密,如下:

……
app.MapGet("/encrypt/{str}", (IDataProtectionProvider provider, ILogger<Program> logger, string str) =>
{var protector = provider.CreateProtector("a.b.c");var sec = protector.ToTimeLimitedDataProtector().Protect(str, TimeSpan.FromSeconds(30));logger.LogInformation(sec);return "加密:" + sec;
});
app.MapGet("/decrypt/{sec}", (IDataProtectionProvider provider, ILogger<Program> logger, string sec) =>
{var protector = provider.CreateProtector("a.b.c");var str = protector.ToTimeLimitedDataProtector().Unprotect(sec);logger.LogInformation(str);return "解密:" + str;
});……

如果加密串过期提交,报错如下:

17afb6001b90f1bf5358b022a0106420.png

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

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

相关文章

linux下安装配置DHCP服务器

前提是已经安装了 core 及 base 两个组 12345# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.4 (Santiago) # uname -a Linux localhost.localdomain 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013 x86_64 x86_64 x86_64 GNU/Linux修改…

java ecc 加密_java-信息安全(十一)-非对称加密算法002-ECC,签名003-ECDSA签名

一、概述ECC算法(Elliptic curve cryptography&#xff0c;椭圆曲线密码学)椭圆加密算法(ECC)是一种公钥加密体制&#xff0c;最初由Koblitz和Miller两人于1985年提出&#xff0c;其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。是目前已知的公…

网络数据嗅探工具HexInject

网络数据嗅探工具HexInject网络数据嗅探是渗透测试工作的重要组成部分。通过嗅探&#xff0c;渗透人员可以了解足够多的内容。极端情况下&#xff0c;只要通过嗅探&#xff0c;就可以完成整个任务&#xff0c;如嗅探到支持网络登录的管理员帐号和密码。为了实现这个功能&#x…

.NET 云原生架构师训练营(权限系统 代码实现 ActionAccess)--学习笔记

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第188篇原创文章目录开发任务代码实现开发任务DotNetNB.Security.Core&#xff1a;定义 core&#xff0c;models&#xff0c;Istore&#xff1b;实现 defaul…

小米暑期实习在线笔试2015-04-25

周五晚上参加了小米的全国在线笔试&#xff0c;使用的是百一测评&#xff0c;不得不说&#xff0c;这是我参加过的最不靠谱的在线笔试。 先来描述题目&#xff0c;再来吐槽&#xff0c;在线笔试就是三个必做题和两个附加题。 必做题是三个算法题&#xff0c; 第一题是判断两个十…

表格列mouse经过时高亮显示

前几天Insus.NET有练习《表格行mouse经过时高亮显示》http://www.cnblogs.com/insus/p/3715733.html &#xff0c;今天有奇想&#xff0c;是否可以实现mouse经过表的列时&#xff0c;整列高亮呢&#xff1f;Insus.NET就在前一示例中&#xff0c;修心jQuery来练习。 修改.mouseo…

REDIS调优

2019独角兽企业重金招聘Python工程师标准>>> 1、优先使用批量操作&#xff0c;例如hset&#xff0c; 2、批量命令用管道技术 3、因为redis是单线程的防止慢命令阻塞 4、可以搭建主从读写分离集群&#xff0c;费时的操作都移到读服务 用slowlog get 查看耗时操作 转载…

socket.io服务端是java_SpringBoot(23) 集成socket.io服务端和客户端实现通信

Slf4jService(value "socketIOService")public class SocketIOServiceImpl implements ISocketIOService {/*** 存放已连接的客户端*/private static Map clientMap new ConcurrentHashMap<>();/*** 自定义事件push_data_event,用于服务端与客户端通信*/priv…

LeetCode之Next Greater Element I

1、题目 You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of nums2. Find all the next greater numbers for nums1s elements in the corresponding places of nums2.The Next Greater Number of a number x in nums1 is …

分库分表下极致的优化

题外话这边说一句题外话,就是ShardingCore目前已经正式加入 NCC 开源组织了,也是希望框架和社区能发展的越来越好,希望为更多.netter提供解决方案和开源组件介绍依照惯例首先介绍本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案&#xff0c;…

网页小要求

1. 制作出的网页要求图文并茂&#xff0c;有自己设计的网站Logo图标&#xff1b;文字要有字体格式和颜色上的变化&#xff0c;图形要与网页的内容相关。2. 页面要求使用DIVCSS进行页面设计布局&#xff0c;至少 4个页面&#xff08;图像文件不能太大&#xff09;&…

关于photoshop

photoshop的常见快捷键&#xff1a;&#xff08;只写了一部分&#xff0c;还有的实用快捷键不知道&#xff09; 矩形、椭圆选框工具 M移动工具 V 套索、多边形套索、磁性套索 L 魔棒工具 W 裁剪工具 C 切片工具、切片选择工具 K 喷枪工具 J 画笔工具、铅笔工具 B 像皮图章、图案…

linux(centos) NET模式网络配置

2019独角兽企业重金招聘Python工程师标准>>> linux虚拟机一般使用桥接和net模式&#xff0c;但是由于桥接在不同的网络环境中&#xff0c;需要重新配置&#xff0c;所以建议使用net模式&#xff0c;net模式的配置步骤如下&#xff1a; 虚拟机网络连接使用NAT模式&am…

LeetCode之Island Perimeter

1、题目 You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one is…

java获取tomcat目录结构_tomcat目录结构简介_动力节点Java学院整理

tomcat目录结构简介如果我们有一个web应用&#xff0c;名称为“mail”(同时也是web应用所在目录的名称)&#xff0c;那么其目录内不同类型的文件应该服从如下放置的规则&#xff1a;一般来讲&#xff1a;对于html、jsp、css、js文件等&#xff0c;可以直接放置在web应用所在目录…

Linux和Windows下部署BeetleX服务网关

有朋友希望写一篇BeetleX服务网关部署到Linux和windows下并以服务的方式运行的介绍文章。接下详细介绍如何做并简单介绍一下网的使用。首先需要在官网(beetlex-io.com)下载对应版本的BeetleX服务网关&#xff08;现阶段只支持linux64和windows64&#xff09;&#xff0c;下载完…

HDU 1978 How many ways DP问题

How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2568 Accepted Submission(s): 1509 Problem Description这是一个简单的生存游戏&#xff0c;你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的…

课堂练习-找水王绪

题目&#xff1a;三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水&#xff0c;传说在论坛上有一个“水王”&#xff0c;他不但喜欢发帖&#xff0c;还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。 如果你有一张当前论坛的…

LeetCode之Nim Game

1、题目 You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove …

适配器模式和装饰模式

1 什么是适配器模式 当我要使用一个类时&#xff0c;但是我发现它的接口不是我想要的模样&#xff0c;这个时候&#xff0c;我可以使用适配器模式&#xff0c;新设计一个类&#xff0c;然后这个类提供我想要的接口&#xff0c;在它里面引用原来的类。 2 什么是装饰模式 当我想要…