2019独角兽企业重金招聘Python工程师标准>>>

数据安全往往是开发人员很容易忽略的一个部分,包括我自己。近两年业内也出现了很多因为安全问题导致了很多严重事情发生,所以安全对我们开发人员很重要,我们要对我们的代码的安全负责。

在工作中,我们常常会见到 encode,base64,sha256, rsa, hash,encryption, md5 等,一些人对他们还傻傻分不清楚,也不知道什么时候使用他们,还有一些人认为MD5就是加密算法。

在 ASP.NET Core 中,为数据保护相关提供了一批新的 API,包括加密解密机制,下面就让我们来看看吧。

目录

  • 加密,编码,哈希之间的区别
  • 数据保护(Data Protection)介绍
  • ASP.NET Core 中的数据保护
  • 总结

编码,加密,哈希之间的区别

编码
编码是信息从一种形式或格式转换为另一种形式的过程,他们是可逆的。
如 url、base64、jsunicode、utf-8等等。

加密
加密是可逆的,类似于编码也是把数据从一种形式转换为另一种形式,它通过一个特定的加密的密匙,相对应的有解密的过程。加解密的算法有2种:对称加密算法和非对称加密算法。
对称:DES、AES、SM1、RC4 等等。
非对称:RSA、ECC、SM2 等等。

哈希
又叫"散列",就是把任意长度的数据转换成固定长度的“指纹”,这个过程是不可逆的。而且只要输入发生改变,输出的 hash值也会有很大不同。
它还有一个特性是相同的输入总是有相同的结果, 这种特性恰好合适用来用来保存密码。
如:MD5、SHA256, SHA512, RipeMD, WHIRLPOOL等等。

数据保护(Data Protection)介绍

在看数据保护官方文档的时候,微软的文档是这样写的,大致意思就是他们基于几点需求,要开发一套数据保护的库以便用来给受信任的客户端和不受信任的客户端来使用。这几点要求就是:

1、真实性、完整性
举了一个身份验证cookie的例子,就是服务端生成了一个包含xyz权限的token,然后会在将来的某个时间过期,这个时候就需要重新请求生成一个,怎么样来保证请求的token不是被篡改过的。

2、机密性
服务器要保证请求是受信任的,所以就需要一些包含特定操作环境的信息,比如一个路径,一个权限或者一个句柄或者其他的一些东西特定于服务器的东西,这些信息不应该透漏给不受信任的客户端,也就是说类似于私钥。

3、隔离性
然后就是要求做成一个组件,并且这个组件具有独立性,可以不依赖于系统中的其他组件。如一个bearer token的组件,它要使用这个组件的话,也不需要引用anti-CSRF这种机制了。

再进一步的缩小需求范围,加密的数据不需要在系统之外的其他系统中使用,另外处理速度要尽可能的快,因为每一次web请求都会使用加密组件一次或者多次。

基于以上要求,微软提出来可以使用密码学,因为这是一个典型的密码学应用的场景。确实这是一个密码学的应用场景,并且是一个非对称加密算法的场景。但是大家都知道,非对称加密是由一个公钥和私钥用来保证安全性的,即使公钥遭泄露,整个通讯仍然是安全的,这就是它比对称加密的好处。但是非对称加密也是有缺点的,就是加密和解密花费的时间长,速度慢。

但是上面的要求又是需要速度尽可能快,怎么办呢? 于是微软的工程师们想出了可以通过精简并且优化非对称加密机制,来达到这个要求。因为不需要跨系统或者跨语言什么的,所以也不需要什么协议之类的,这就给优化带来了更多的可能性。

到这里,我就想,如果让我来基于以上几点来设计开发这样一个系统,我应该怎么样设计?怎么样达到要求?
带着这个问题,我们来进一步看看微软是怎么样做的吧?

下面是一些总结的设计原则 :

1、配置应该尽量的简单,默认情况下应该可以零配置,开发人员可以直接运行。

2、提供一个简单的API,应该容易使用,并且不会轻易用错。

3、开发人员不需要专门学习怎么样管理这些钥(公钥,私钥),系统应该自动的选择算法和管理钥的生命周期。理想情况下开发人员都不应该访问这些钥的原始文件。

4、钥应该是受保护的,不会被远程调用到。系统应该有一个自动保护机制并且可以自动应用。

如果让我设计这样一个库,我可能不会想到这么多,也许只会想到前3点。

再看一下针对的受众群体:

1、应用程序开发人员和框架开发人员(不需要学习任何知识)。

2、应用开发人员和系统管理员(不使用默认配置,只是设定一些路径等)。

3、针对具有更高安全意识的开发人员提供可扩展api,或特定需求扩展(需要重写系统的组件,有一些独特的需求)。

以上,可以看到微软在开发一个组件的时候对问题的分析,也许我们可以从中学到一些东西。

ASP.NET Core 中的数据保护

Web应用程序中经常需要存储一些敏感数据(如用户密码),Windows 系统为桌面程序提供了DPAPI用来使用,但是并不适用于 Web 系统。ASP.NET Core提供了一套简单易用的API 用来保护数据。

ASP.NET Core 中,数据保护主要是用来给服务端设计的,用来替换ASP.NET 1.x-4.x中的,machineKey主要是用来保证使用Form身份验证时Cookie数据的加密解密,以确保不会被修改。或者ViewState数据的加密解密不被篡改,以及对session状态标识进行验证。

先看一下最简单的使用方法:

using System;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.DependencyInjection;public class Program
{public static void Main(string[] args){// 添加数据保护到服务中var serviceCollection = new ServiceCollection();serviceCollection.AddDataProtection();var services = serviceCollection.BuildServiceProvider();// 从DI中创建一个MyClass的实例 var instance = ActivatorUtilities.CreateInstance<MyClass>(services);instance.RunSample();}public class MyClass{IDataProtector _protector;// 参数 'provider' 来自 DIpublic MyClass(IDataProtectionProvider provider){_protector = provider.CreateProtector("Contoso.MyClass.v1");}public void RunSample(){Console.Write("Enter input: ");string input = Console.ReadLine();// 加密string protectedPayload = _protector.Protect(input);Console.WriteLine($"Protect returned: {protectedPayload}");// 解密string unprotectedPayload = _protector.Unprotect(protectedPayload);Console.WriteLine($"Unprotect returned: {unprotectedPayload}");}}
}/** 输出:** Enter input: Hello world!* Protect returned: CfDJ8ICcgQwZZhlAlTZT...OdfH66i1PnGmpCR5e441xQ* Unprotect returned: Hello world!*/

CreateProtector("Contoso.MyClass.v1")中,参数“Contoso.MyClass.v1”可以理解为一个公钥,因为 ASP.NET Core Data Protection 是非对称加密(见前面介绍),所以系统中应该还有一个密钥,那么此处的密钥 ASP.NET Core 在系统内部帮你维护了。

读到这里,有同学可能会问了,那系统中是如何帮我维护我的密钥的呢? 我们不妨先来做一个测试。

首先,我在我的开发环境中,先把上面的程序中的解密部分代码注释掉,然后运行上面的程序,输入一个“Hello World!” ,得到了一个加密的字符串CfDJ8ICcgQwZZhlAlTZT...OdfH66i1PnGmpCR5e441xQ(略写)。

然后我把同样的程序拷贝到另外一台开发环境的机器上,然后把上面的加密部分代码注释掉,使用第一步生成的CfDJ8ICcgQwZZhlAlTZT...OdfH66i1PnGmpCR5e441xQ来解密,注意这两步中我们都使用 "Contoso.MyClass.v1" 来做为公钥。

运行程序,查看结果:

程序抛出了一个“System.Security.Cryptography.CryptographicException”异常的结果。

为什么呢? 这是因为每一台机器都有一个自有的私钥,由于在解密的过程中,这个私钥是不同的,所以解密失败,抛出了一个异常。

私钥

私钥存放在哪里呢?

1、如果程序寄宿在 Microsoft Azure下,存储在“%HOME%\ASP.NET\DataProtection-Keys” 文件夹。

2、如果程序寄宿在IIS下,它被保存在HKLM注册表的ACLed特殊注册表键,并且只有工作进程可以访问,它使用windows的DPAPI加密。

3、如果当前用户可用,即win10或者win7中,它存储在“%LOCALAPPDATA%\ASP.NET\DataProtection-Keys”文件夹,同样使用的windows的DPAPI加密。

4、如果这些都不符合,那么也就是私钥是没有被持久化的,也就是说当进程关闭的时候,生成的私钥就丢失了。

下面是博主机器上的私钥文件:

一个xml配置文件,位于C:\Users\用户名\AppData\Local\ASP.NET\DataProtection-Keys文件夹,名为:key-c37e3ed9-fbb5-47bc-9e8c-128afaf1c6d9.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<key id="c37e3ed9-fbb5-47bc-9e8c-128afaf1c6d9" version="1"><creationDate>2016-08-15T05:21:16.7925949Z</creationDate><activationDate>2016-08-15T05:21:16.7165905Z</activationDate><expirationDate>2016-11-13T05:21:16.7165905Z</expirationDate><descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=1.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=1.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+sBAAAArS6GBZu5C024S8VcNDckGgAAAAACAAAAAAAQZgAAAAEAACAAAABBUO4j0CscEZsdcHDAStXnDvtx+zFucmsG90sdhyjfgQAAAAAOgAAAAAIAACAAAABGr9fgvZkLAlgIZkGym5uLiufpaEcuVsp35+J96ItTYlABAADEZxVArK0QtxufuaRt/kVR2ZBZEoLhlYJ44BhvQDd6b9tN0L9Y7W2eeBPBefcZaGZk5xILwZYI5box9omwC/mp8t9wopVaratjZuNs21Al+JzxS+PeV9X0iPtRyfx2K7DJYOUT6IqoFR2ykL5MI9jvkIbUxcQOs0BKOwAHl4yAlYF2tR8pz1FkXKqZafovc11aOZeZhkfd2hiA53tan94bQOP43Z4HF+QWSazrq5IIqdFSOyZQemWL9Z7eYyoNpEktf3eGZQu/KBOg/BH5yizWa+6b7RLcEX6JdQ2/jpmnHNl+HPMIah3UZV0mRfAE2j58cUjosnV+LDQZoLn4OP70YWtO/tTBc4tsEY3n/WboL4PgPPmQ+2jfd/zmEQIon+4d7TY+mGh4c6wXAmAZF517UAHQMC1icx4HSJC8DTuWPlINihPyufejuPmLqW6CW8NAAAAA7ziObXv+Ax4Mm0AtZiGw0/IepDv/gJSxhEwLIDhfvQIQJv//G500EYtIbZJW6sWit//ypfjrUZYglHgKV+GpbA==</value></encryptedKey></encryptedSecret></descriptor></descriptor>
</key>

文件包含一个创建日期,一个过期日期。间隔为90天,当90天之后密钥就会失效,系统将自动生成一个新的密钥并设置新的密钥作为活动的密钥。只要已过期的密钥还存在于系统上,你仍然可以解密任何受保护的数据。

文章不宜太长,下篇再接着写。
如果您觉得本篇文章对你有用的话,不妨点个【推荐】。

总结

这篇文章算是对ASP.NET Core Data Protection做了一个大致的介绍,并且包含了一个简单的使用方法。 在实际使用过程中,其实很多组件内部都会使用到它,比如Session中间件,Identity中间件,Authercation中间件等等,对于普通开发人员在编码的时候可能不会用到,但是在做系统分布式部署的时候如果你不了解这个机制可能就会遇到麻烦了(详见蟋蟀博客的这篇文章),所以还是可以期待一下下文,更加深入的了解它,掌握它。

转载于:https://my.oschina.net/dingliu/blog/759897

ASP.NET Core 数据保护(Data Protection)【上】相关推荐

  1. Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一)

    图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core Web Api实现图片上传存储以及生成缩略图呢?今天我就使用MongoDB作为图片存储 ...

  2. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程 原文:Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程 Asp.Net Cor ...

  3. ASP.NET Core 数据保护(Data Protection)【中】

    2019独角兽企业重金招聘Python工程师标准>>> API 接口 ASP.NET Core Data Protectio 主要对普通开发人员提供了两个接口,IDataProtec ...

  4. 在TypeScript和ASP.NET Core中处理文件上传和受保护的下载

    目录 介绍 背景 使用代码 注册您的API main.ts api-plugin.d.ts 上传文件 提交文件 API服务方法 ASP.NET Core API方法 下载文件 客户端API下载 保护上 ...

  5. asp.net core在linux进行上传视频ffmpeg截图

    项目要求,视频要提供一张截图.在linux使用ffmpeg,没有window方便可以直接用exe文件:因为我们使用的操作系统是centos7.0+ ,必须先安装; 1.在centos上安装FFMPEG ...

  6. 【壹刊】Azure AD(二)调用受Microsoft 标识平台保护的 ASP.NET Core Web API (上)

    ---------Grant_Allen 是一位博客园新晋博主,目前开始专注于Azure方向的学习和研究,是我认识不多的.打算长时间研究Azure的群友,因此打算帮他开个专栏,同时也希望并祝愿他能一直 ...

  7. Asp.net core应用在 Kubernetes上内存使用率过高问题分析

    原文:https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/ ps ...

  8. ASP.NET CORE 之 在IIS上部署MVC项目

    与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel ...

  9. Asp.Net Core文件或图片上传

    管理后台上传的图片或文件可能也需要在 Api 项目能够访问,考虑到文件的统一管理,后台的文件默认 是上传到 Api 项目里的. Web 项目里的配置文件 appsetting.json 中的 ApiS ...

  10. ASP.Net Core创建MVC项目上传文件(缓冲方式)

      学习了普通webapp中上传文件,再看看从MVC项目中通过缓冲方式上传文件到物理文件夹.这两者的区别主要是webapp通过模型绑定的方式传递IFormFile对象,而mvc通过控制器和action ...

最新文章

  1. ASP.NET虚拟主机的重大安全隐患
  2. Where art thou
  3. ubi-partman failed with exit code 141
  4. 信息树和XML文件的遍历及XML文件的应用
  5. 佳顺通用进销存系统去广告_免费OA办公系统的问题汇总回答
  6. python process 函数_Python Process创建进程的2种方法详解
  7. 设计一个较为合理的实验方案来研究芳纶纤维的染色热力学性能
  8. 2018-2019-1 《信息安全系统设计基础》教学进程
  9. 一流企业都在做数据治理,还用百万年薪招人,想做的无非这10点
  10. SQL Server AlwaysOn读写分离配置
  11. python访问组策略_python 组策略
  12. 秋无痕 Windows 7 SP1 (64位旗舰版) 集成安装增强版 V2018年春节版(整合USB3+NVMe+UEFI)
  13. 1106 Lowest Price in Supply Chain (25分)
  14. 周志华机器学习(一)
  15. 【学习OpenCV4】图像金字塔总结
  16. 大数据在医疗行业中的5种应用
  17. BAPI_ALM_ORDER_MAINTAIN 修改维修工单组件示例
  18. pip install psycopg2报错
  19. html拆分单元格多行,拆分一个单元格中多行字符到不同单元格
  20. linux安装git安装

热门文章

  1. 手机自带html怎么卸载,手机自带软件怎么卸载
  2. msi2lmp不能用,mpi不能连接主机,解决办法看这里
  3. 图片怎么修改尺寸大小?在线调整图像大小的方法
  4. 【Atheros】Ath9k速率调整算法源码走读
  5. fatal: unable to access 'https://chromium.googlesource.com/webm/libwebp/': Failed to connect to chro
  6. 3D MAX 中的 vary 参数建议。测试图以及中等质量和高等质量参数设置.
  7. 新冠病毒数据分析报告
  8. 拳皇觉醒服务器维护,拳魂觉醒活动什么时候开 服务器开区活动时间顺序
  9. 个人所得税 java_计算个人所得税的java代码
  10. 不用上班还能衣食无忧