集群场景,数据保护

作者: 数据库信息  发布:2019-12-06

 •创建一个Key 并且持久存储
 •从存储库中获取所有的 Key
 •撤销保存到存储中的一个或多个键

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

前言 

私钥存放在哪里呢? 

XMLKeyManager是一个具体实现IKeyManager的类,它提供了一些非常有用的方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

接口部分写到这里吧,因为这一篇我想把重点放到下面,更多接口的介绍大家还是去官方文档看吧~ 

私钥 

“Application discriminator”,它是用来标识应用程序的唯一性。
 为什么需要这个东西呢?因为在集群环境中,如果不被具体的硬件机器环境所限制,就要排除运行机器的一些差异,就需要抽象出来一些特定的标识,来标识应用程序本身并且使用该标识来区分不同的应用程序。这个时候,我们可以指定ApplicationDiscriminator。 

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

上面的API估计看着有点枯燥,那我们就来看看我们需要在集群场景下借助于Data Protection来做点什么吧。 

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

GetAllElements来检索所有存在的加密的xml文件。 

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

services.AddDataProtection(x => x.ApplicationDiscriminator = "my_app_sample_identity");

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

•IAuthenticatedEncryptorConfiguration 主要是规定新 Key 使用的算法。
•IXmlRepository 主要控制 Key 在哪里持久化存储。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

CreateEncryptorInstance() : IAuthenticatedEncryptor
ExportToXml() : XmlSerializedDescriptorInfo

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

如果在集群环境中,他们需要具有配置相同的主加密键。 

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

下面是IAuthenticatedEncryptor接口提供的两个 api方法:
Decrypt(ArraySegment<byte> ciphertext, ArraySegment<byte> additionalAuthenticatedData) : byte[]
Encrypt(ArraySegment<byte> plaintext, ArraySegment<byte> additionalAuthenticatedData) : byte[]

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

也就是说集群环境下同一应用程序他们需要设定为相同的值(ApplicationName or ApplicationDiscriminator)。 

目录
 •加密,编码,哈希之间的区别
 •数据保护(Data Protection)介绍
 •ASP.NET Core 中的数据保护
澳门金莎娱乐网站 , •总结 

我们可以通过实现IXmlRepository接口的StoreElement方法来定义data protection xml的存储位置。 

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

首先,定义个针对IXmlRepository接口的 redis 实现类RedisXmlRepository.cs:

澳门金莎娱乐网站 1

接【中篇】 ,在有一些场景下,我们需要对 ASP.NET Core 的加密方法进行扩展,来适应我们的需求,这个时候就需要使用到了一些 Core 提供的高级的功能。 

上一篇记录了如何在 Kestrel 中使用 HTTPS(SSL), 也是我们目前项目中实际使用到的。 

就是上篇中说的那个私钥存储位置:

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

可以看到这个扩展返回的是一个IDataProtectionBuilder,在IDataProtectionBuilder还有一个扩展方法叫 SetApplicationName ,这个扩展方法在内部还是修改的ApplicationDiscriminator的值。也就说以下写法是等价的:

数据保护(Data Protection)介绍 

“Master encryption key”,主要是用来加密解密的,包括一客户端服务器在请求的过程中的一些会话数据,状态等。有几个可选项可以配置,比如使用证书或者是windows DPAPI或者注册表等。如果是非windows平台,注册表和Windows DPAPI就不能用了。

1、编码

IAuthenticatedEncryptorDescriptor接口提供了一个创建包含类型信息IAuthenticatedEncryptor实例方法。

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

 public void ConfigureServices(IServiceCollection services) 
{
 services.AddDataProtection()
 //windows、Linux、macOS 下可以使用此种方式 保存到文件系统
 .PersistKeysToFileSystem(new System.IO.DirectoryInfo("C:\share_keys\"))
 //windows 下可以使用此种方式 保存到注册表
 .PersistKeysToRegistry(Microsoft.Win32.RegistryKey.FromHandle(null)) 
} 

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

 public sealed class XmlKeyManager : IKeyManager, IInternalXmlKeyManager
{
 public XmlKeyManager(IXmlRepository repository, IAuthenticatedEncryptorConfiguration configuration, IServiceProvider services);

 public IKey CreateNewKey(DateTimeOffset activationDate, DateTimeOffset expirationDate);
 public IReadOnlyCollection<IKey> GetAllKeys();
 public CancellationToken GetCacheExpirationToken();
 public void RevokeAllKeys(DateTimeOffset revocationDate, string reason = null);
 public void RevokeKey(Guid keyId, string reason = null);
} 

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

在做集群的时,我们必须知道并且明白关于 ASP.NET Core Data Protection 的三个东西:

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

本文还列举了在集群场景下,有时候我们需要实现自己的一些方法来对Data Protection进行分布式配置。 

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

IAuthenticatedEncryptor是 Data Protection 在构建其密码加密系统中的一个基础的接口。
 一般情况下一个key 对应一个IAuthenticatedEncryptor,IAuthenticatedEncryptor封装了加密操作中需要使用到的秘钥材料和必要的加密算法信息等。 

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

关于ASP.NET Core Data Protection 系列终于写完了,其实这这部分花了蛮多时间的,对于Data Protection来说我也是一个循循渐进的学习过程,希望能帮助到一些人。

前言 

在【上篇】的时候说过,默认情况下Data Protection会生成 xml 文件用来存储session或者是状态的密钥文件。这些文件用来加密或者解密session等状态数据。 

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

 public void ConfigureServices(IServiceCollection services) 
{
 services.AddDataProtection()

 //windows dpaip 作为主加密键
 .ProtectKeysWithDpapi()

 //如果是 windows 8  或者windows server2012  可以使用此选项(基于Windows DPAPI-NG)
 .ProtectKeysWithDpapiNG("SID={current account SID}", DpapiNGProtectionDescriptorFlags.None)

 //如果是 windows 8  或者windows server2012  可以使用此选项(基于证书)
 .ProtectKeysWithDpapiNG("CERTIFICATE=HashId:3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0", DpapiNGProtectionDescriptorFlags.None)

 //使用证书作为主加密键,目前只有widnows支持,linux还不支持。
 .ProtectKeysWithCertificate();
} 

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

IKeyManager接口提供了一系列用来操作Key的方法,包括存储,检索操作等。他提供的高级操作有:

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

XmlKeyManager 通常情况下,开发人员不需要去实现IKeyManager来自定义一个 KeyManager。我们可以使用系统默认提供的XmlKeyManager类。 

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

本文由金沙澳门官网发布于数据库信息,转载请注明出处:集群场景,数据保护

关键词: 金沙澳门官网

上一篇:Python中Scrapy爬虫图片管理详明
下一篇:没有了