ASP.Net Core中的数据保护堆栈提供了一个易于使用的加密API,用于保护数据,包括必要的加密和解密机制。 本文探讨了在构建ASP.Net Core应用程序时如何使用此API。
在Visual Studio中创建一个ASP.Net Core MVC项目
首先,让我们在Visual Studio中创建一个ASP.Net Core项目。 假设系统中已安装Visual Studio 2017或Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建新的ASP.Net Core项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.Net Core Web应用程序”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 在接下来显示的“创建新的ASP.Net Core Web应用程序”窗口中,从顶部的下拉列表中选择.Net Core作为运行时,并选择ASP.Net Core 2.2(或更高版本)。
- 选择“ Web应用程序(Model-View-Controller)”作为项目模板,以创建新的ASP.Net Core MVC应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
按照这些步骤应该在Visual Studio中创建一个新的ASP.Net Core项目。 我们将在本文的后续部分中使用该项目。
ASP.Net Core中的数据保护API充分利用了哈希和加密的安全性。 在继续之前,让我们花一点时间来理解这两个概念。
加密和哈希不同
加密和哈希是与安全相关的两个重要概念,通常可以互换使用,但使用不正确。 加密是一种使用密码算法将数据从一种形式转换为另一种形式的技术。 这是双向功能,因为只能使用适当的密钥来解密已加密的数据。 加密的数据称为密文。 迄今为止,加密是保护当今通信系统中数据安全的最有效方法。
相比之下,散列是一种从文本字符串生成唯一消息摘要的技术。 应该注意的是,散列数据始终是唯一的。 您不能从不同的文本中产生相同的哈希值。 此外,几乎不可能从哈希值取回原始文本。 因此,虽然加密是一种双向技术,包括使用密钥对数据进行加密和解密,但哈希是一种单向技术,它将一串纯文本更改为一个独特的摘要,该摘要不能轻易地还原为原始文本。 。
安装Microsoft.AspNetCore。 DataProtection NuGet软件包
要在ASP.Net Core中使用数据保护API,请从Visual Studio的NuGet程序包管理器窗口中安装Microsoft.AspNetCore.DataProtection程序包。 或者,您可以通过输入以下命令,通过NuGet软件包管理器控制台安装此软件包。
Install-Package Microsoft.AspNetCore.DataProtection -Version 2.2.0
在ASP.Net Core中配置数据保护API
AddDataProtection扩展方法可用于配置Data Protection API。 以下代码段说明了如何在Startup类的ConfigureServices方法中完成此操作。
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection();
...
services.AddMvc().SetCompatibilityVersion
(CompatibilityVersion.Version_2_2);
}
如果要将密钥存储在文件系统中,则需要配置数据保护API,方法如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection().PersistKeysToFileSystem
(new DirectoryInfo(@"D:\IDG\Temp"));
}
请注意,密钥是由Data Protection API创建和维护的,默认情况下,这些密钥的寿命为90天。 您还可以指定密钥的生存期。 以下代码段说明了如何实现此目的。
public void ConfigureServices(IServiceCollection services)
{
services.ConfigureDataProtection(dp =>
{
dp.PersistKeysToFileSystem
(new DirectoryInfo(@"D:\IDG\Temp"));
dp.SetDefaultKeyLifetime(TimeSpan.FromDays(7));
});
....
}
您甚至可以使用证书保护密钥,也可以将密钥存储在Azure Key Vault中。 如果要将密钥保留在Azure Key Vault中,则应配置Data Protection API,如下面给出的代码片段所示。
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri(
"Specify the Uri here"))
.ProtectKeysWithAzureKeyVault
("keyIdentifier", "clientId", "clientSecret");
}
在ASP.Net Core中使用Data Protection API加密数据
现在已经在项目中安装并配置了Data Protection API,您可以利用API保护数据了。 要利用控制器中的Data Protection API,可以使用以下代码。
public class HomeController : Controller
{
IDataProtector _protector;
public HomeController(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector(GetType().FullName);
}
public IActionResult Index()
{
TestModel testModel = new TestModel();
var protectedData = _protector.Protect("Hello World");
testModel.Data = protectedData;
//Write code here to persist the model to the db or to a file
return View();
}
//Other action methods
}
当您执行应用程序并在action方法中设置断点时,您将能够看到数据已被加密。
您可以创建一个帮助程序类,以使用Data Protection API加密和解密数据。 下面的代码清单显示了可用于此目的的可重用类。 注意如何将密钥作为第二个参数传递给Encrypt和Decrypt方法。 这使您可以使用自定义密钥来加密和解密数据。
public class DataProtectionHelper
{
private readonly IDataProtectionProvider
_dataProtectionProvider;
public DataProtectionHelper(IDataProtectionProvider
dataProtectionProvider)
{
_dataProtectionProvider = dataProtectionProvider;
}
public string Encrypt(string textToEncrypt, string key)
{
return _dataProtectionProvider.CreateProtector(key).
Protect(textToEncrypt);
}
public string Decrypt(string cipherText, string key)
{
return _dataProtectionProvider.CreateProtector(key).
Unprotect(cipherText);
}
}
Data Protection API易于使用且灵活。 这是加密数据(例如查询字符串和cookie)的好选择,这些数据将被保护并仅保留很短的时间。 如果计划长时间使用密文(加密数据),则可能需要实施自己的加密和解密逻辑。
From: https://www.infoworld.com/article/3431139/how-to-use-the-data-protection-api-in-aspnet-core.html