Introduction to Data Protection
数据保护简介
Web应用程序经常需要存储安全敏感数据。Windows为桌面应用程序提供了DPAPI,但是并不适用于Web应用程序。ASP.NET核心数据保护堆栈提供了使用加密API的简易方法,开发者可以用以保护数据,包括密钥管理和交换。
ASP.NET核心数据保护堆栈设计用户长期替代ASP.NET 1.x-4.x中的<machineKey>元素。该堆栈设计解决就密码堆栈的很多缺点,同时为现代应用程序可能遇到的大多数案例提供解决方案。
Problem statement
问题陈述
整体问题陈述可以简化概括为一句话:我需要为以后检索提供可持久化的信息存储,但是我并不信任存储机制。用网络术语表示即为“我需要通过不可信的客户端,获取和返回可信状态。”
一个典型例子就是用户认证cookie或者bearer token。服务器生成一个“I am Groot and have xyz permissions” token 并把它发送给客户端。在将来的某一天,客户端会把这个 token 返回给服务器,但是服务器需要判断客户端没有伪造这个 token。因此第一个要求:真实性(又名完整性、防篡改)。
基于持久状态是被服务器所信任的,我们预计这种状态可能包含特定环境的信息。这些信息可以文件路径、权限、句柄、间接引用或服务器专用数据。通常情况下这类信息不应该透漏给不可信的客户端,因此产生了第二个需求:保密性。
最后,因为现代也能够用程序是组件化的,我们看到个别组件会想利用系统而不去考虑系统的其他组件。例如:如果一个bearer token 组件正在使用这个堆栈,它不应受到来自一个可能也在使用同一个堆栈的防CSRF(跨站请求伪造)机制的干扰。因此产生了最后一个需求:隔离性。
我们可以提供进一步的约束条件,用以缩小需求范围。假设在加密系统内运行的所有服务器是被同样信任的,数据也无需在我们的控制下通过外部服务生成和消耗。另外,我们需要所有运行尽可能的迅速,因为向Web服务器发出的每次请求会一次或多次进入加密系统。这使得对称密码系统称谓我们方案的理想选择。我们可以忽视非对称加密系统,直到需要的时候。
Design philosophy
设计原理
我们先从现有堆栈着手去发现问题。接下来通过调查现有的解决方案得出结论,现有的解决方案达不到我们的要求。然后,我们再基于一下的几条指导原则设计一个解决方案:
- 系统应配置简单。理想情况下,系统应是零配置,开发者可以立刻开始投入工作。如果开发人员需要针对某个方面进行配置(例如:密钥资源库),应当考虑使这些设置尽可能简洁。
- 提供一个简单的面向用户的API,APIs 应该易于正确使用,难以出错。
- 开发人员应该掌握密钥管理原则,系统应代表开发人员处理算法选择和密钥生成时间。理想情况下,开发人员甚至不应有权访问原始密钥。
- 如果可能密钥应以休眠状态加以保护。系统应该指定一个合适的默认保护机制,并且自动使用。
由此出发,我们开发了一个简单易用的数据保护堆栈。
ASP.NET Core 数据保护 APIs 起初并非用于加密负载的不确定持久性。其他技术例如:Windows CNG DPAPI 和 Azure Rights Management 更适合不确定存储的情况,并且响应的这些技术具有较强的密钥管理能力。尽管如此,也没有什么阻止开发人员使用ASP.NET Core 数据保护 APIs 来长期保护加密数据。
Audience
受众
数据保护系统分成5个主要模块,APIs 的不同方面面相三类主要受众;
- Consumer APIs Overview 面向应用程序和框架开发者。
“我不想了解堆栈如何运行,如何配置。我只想提高概率的成功使用APIs 以尽可能简单的使用方式。”
- configuration APIs 面相应用程序开发人员和系统管理人员。
“我需要告知数据保护系统,我们环境需要非默认路径和配置。”
- 扩展性 APIs 面相负责执行自定义策略的开发人员。这些 APIs 的使用仅限于特殊情况和经验丰富,有安全意识的开发人员。
“我们需要替换系统内的一个完整组件,因为我们有独一无二的行为需求。我愿意为构建满足需求的一个插件去学习 API 不常用的部分。”
Package Layout
数据保护堆栈包括五个模块。
- Microsoft.AspNetCore.DataProtection.Abstractions 包含基本IDataProtectionProvider 和 IDataProtector接口。同时包含可以辅助这些类型(例如:IDataProtector.Protect 的重载)的扩展方法。有关更多信息请参阅用户接口使用部分。如果有人负责实例化数据保护系统,你可以参考,Microsoft.AspNetCore.DataProtection.Abstractions。
- Microsoft.AspNetCore.DataProtection 包含数据保护系统的核心实现,其中包括核心加密、密钥管理、配置和可扩展性。如果你负责实例化数据保护系统(例如:把它添加到一个IServiceCollection)或修改和扩展其行为,可以参考Microsoft.AspNetCore.DataProtection。
- Microsoft.AspNetCore.DataProtection.Extensions 包含一些附加 APIs 开发人员可能会用到。但是并不属于核心模块。例如:这个模块包含一个简单的API “将指向一个特定的密钥存储目录实例化,而没有依赖注入到 setup。” 同时,它包括保护有效负载受限制生命周期的扩展方法 (更多信息)。
- Microsoft.AspNetCore.DataProtection.SystemWeb 可以安装到一个现有的 ASP.Net 4.x 应用程序中,重定向它的<machineKey>运行。该用新的数据保护堆栈。更多信息情参阅 compatibility。
- Microsoft.AspNetCore.Cryptography.KeyDerivation 提供了PBKDF2 密码散列程序的实现和可用于需要安全处理用户密码的系统。更多信息情参阅 Password Hashing 。
这么多年了第一次发文章,大家多多关照。后续慢慢来~~