在加密、签名和散列数据之后,下面将抽象层移动到更高的位置。本节将讨论数据的保护——存储对安全性敏感的数据。当数据与Web应用程序一起使用时,所使用的客户端是不可信任的。这就是要使用数据保护API了。
另一种需要保护的数据是配置数据。配置数据——比如SQL连接字符串(包括用户名和密码)或AWS或微软Azure的访问令牌——不应该放在公共源代码存储库中。这些信息很容易被误用。实际上,机器人被用来在GitHub的公共存储库中爬行,寻找密钥并使用它们,例如,运转虚拟机来存放比特币。App Secrets提供了一种方法,可以将机密数据存储在用户的配置文件中。
这些技术、数据保护和用户机密都在本节中讨论。
1. 实现数据保护
在.NET Framework中,名称空间System.Security.DataProtection包含DpApiDataProtector类,而这个类包装了本机Windows Data Protection API(DPAPI)。这些类基于Windows,并不提供.NET Core需要的灵活性和功能,所以ASP.NET团队创建了Microsoft.AspNetCore.DataProtection名称空间中的类。
使用这个库的原因是为日后的检索存储可信的信息,但存储媒体(如使用第三方的托管环境)不能信任自己,所以信息需要加密存储在主机上。
示例应用程序是一个简单的控制台应用程序(.NET Core),允许使用数据保护功能读写信息。在这个示例中,可以看到ASP.NET数据保护的灵活性和功能。
数据保护的示例代码使用了以下依赖项和名称空间:
依赖项
Microsoft.AspNetCore.DataProrection
Microsoft.Extensions.DependencyInjection
名称空间
Microsoft.AspNetCore.DataProtection
Microsoft.Extensions.DependencyInjection
System
System.IO
System.Linq
使用-r和-w命令行参数,可以启动控制台应用程序,读写存储器。此外,需要使用命令行,设置一个文件名来读写。检查命令行参数后,通过调用SetupDataProtection辅助方法来初始化数据保护。这个方法返回一个MySafe类型的对象,嵌入IDataProtector。之后,根据命令行参数,调用Write或Read方法:
private const string readOption = "-r";
private const string writeOption = "-w";
private static readonly string[] options = { readOption,writeOption};
static void Main(string[] args)
{
if (args.Length != 2||args.Intersect(options).Count()!=1)
{
ShowUsage();
return;
}
string filename = args[1];
MySafe safe = SetupDataProtection();
switch (args[0])
{
case writeOption:
Write(safe,filename);
break;
case readOption:
Read(safe,filename);