ASP.NET Core 中的数据安全






4.10/5 (9投票s)
本文将介绍如何使用数据保护 API 在 ASP.NET Core 中处理数据安全。
什么是 ASP.NET Core
ASP.NET 在 15 年前设计并推出,此后吸引了数百万开发人员并构建了出色的 Web 应用程序。微软几乎每年都会推出新功能并增加不同的功能,使其更加强大。现在,为了满足当今现代技术的要求,他们推出了 ASP.NET Core,这是一个开源且跨平台的框架(可在 Windows、Mac、Linux,包括 RedHat 和 Ubuntu 上运行),可帮助您构建当代的应用程序,如云应用程序、物联网、移动应用程序等。ASP.NET Core 由微软于 2016 年 6 月发布 [ 在此处查看 ]
为什么我们需要 ASP.NET Core
现在的主要问题是,为什么我们需要 ASP.NET Core?或者为什么使用它?它相对于 ASP.NET 有什么优势?如今,Web 应用程序不再仅仅局限于桌面和笔记本电脑,它已经扩展到智能设备、云应用程序、移动设备和物联网,此外,它还扩展到其他平台(Linux、Mac)。为了满足所有这些(基本)需求,我们需要 ASP.NET Core。
基本上,ASP.NET Core 不再依赖于 *system.web.dll*。它内置了一套 NuGet 包,可以优化应用程序的大小、性能、安全性和开发速度。总之,我们已经转向“按需付费”的模式。
以下是它的一些主要功能:
- 开源:它是开源的(遵循 MIT 和 Apache 2 许可证)。
- 兼容性:它与 .NET Framework、Mono 和 Xamarin 广泛兼容。
- 易于部署
- 轻量级且模块化
- 跨平台支持
- 可在 IIS 上托管或自托管
.NET Framework 与 .NET Core 对比
当然,.NET 是一个稳定且一致的框架,十多年来为数百万个 Web 应用程序提供服务。它是一个即用型框架,拥有数百万个预加载的库。尽管如此,它仍然存在一些缺陷,例如它仅支持 Windows,其庞大的 API 集合会导致性能下降等。
而 .NET Core 比 .NET Framework 更轻量级,因为它不包含任何 API 包。用户只需从 NuGet 安装包并创建定制的应用程序。它有一组名为“CoreFX”的库,以及一个名为“CoreCLR”的运行时。库和运行时都通过 NuGet 分发,因此用户需要根据自己的需求下载。
在 .NET Core 上运行代码非常简单。只需安装 .NET Core SDK --> 初始化一些代码 --> 运行应用程序 --> 完成!
(*在此,我没有提供 ASP.NET Core 的第一个程序,因为本文旨在涵盖 ASP.NET Core 中的安全性,请谅解*)
Web 应用程序中的安全性
多年来,人们一直在努力保护 Web 应用程序及其数据。与 Windows 桌面应用程序不同,Web 应用程序没有数据保护 API (DPAPI) 来保护和加密数据,但 ASP.NET Core 提供了一种非常好的数据保护方式。它有一个保护堆栈,带有一个 API,可以帮助我们使用密钥管理来加密数据。基本上,这些加密 API 经过重新设计,以克服当前框架中存在的所有问题。
数据安全要求
数据安全预期很简单:在服务器往返之间,我的数据应该安全,即使有不受信任的客户端调用。因此,在服务器往返后,服务器应确保数据未被篡改。简而言之,我们需要一个真实的数据传输。
由于模块化和定制化的开发技术,组件可以在任何地方重用,而不管系统如何。在这里,我们需要确保数据不会与其他数据混淆。我们用于加密数据的内容,如文件路径、访问权限、服务器端存储,应该是可靠的,并且不应泄露给不受信任的客户端。
简而言之,数据安全设计应该是真实的、安全的、易于实现的、与常规操作隔离的,核心逻辑应隐藏起来,不被开发人员知晓。
安全策略
考虑到以上所有要求,ASP.NET Core 提出了以下安全策略:
- 开发一个配置需求较少的数据安全系统。
- 密钥逻辑不应向开发人员公开,开发人员甚至无法访问原始密文。
- 加密密钥应由系统本身维护和保护。
为了满足所有要求,ASP.NET Core 提供了数据保护堆栈,这是一个 API,可以帮助我们实现加密和哈希机制。
什么是数据保护 API?谁可以使用它?
基本上,数据保护 API 会创建和管理一个用于加密的秘密密钥,它可以供 3 类用户使用:
- 应用程序和框架开发人员,他们不想了解数据保护 API 和堆栈的工作原理以及如何配置,只想通过输入并从 API 获取输出。
- 系统管理员和开发人员,他们不想将敏感文件和密钥存储在默认路径和默认设置下。这样就没有人可以轻易追踪到。例如,程序默认的 TEMP 数据不应存储到 '%AppData%' 路径(这是默认路径),ASP.NET Core 提供了 'IDataProtectionBuilder' 接口,允许我们更改所有默认路径和设置。
对于数据保护,ASP.NET Core 同时支持加密和哈希技术。现在,问题来了:加密和哈希是什么?如果两者都用于安全,那么加密和哈希之间有什么区别?
加密与哈希
加密是将数据转换为一系列不可读、无序且长度不固定的字符的过程,它需要一个 *密钥* 来加密数据。加密字符串称为密文,因此借助秘密密钥和加密算法,我们可以生成密文。一些流行的加密算法有 DES、Triple DES、AES 等。
哈希是将数据转换为固定长度字符串或数字的过程。在这里,相同的输入总是产生相同的输出。一旦数据被 *哈希*,就无法恢复为原始文本。所以我们永远无法得到我们传入的实际数据。一些流行的哈希技术有 MD5、SHA 等。
加密和哈希之间最大的区别是,在加密中,我们可以将加密文本还原为纯文本,但在哈希中,我们无法将哈希文本还原为原始文本。
命名空间和类
'Microsoft.AspNetCore.DataProtection' 是核心命名空间。如果您只想使用数据保护 API 而不想学习其机制,只需引用 'Microsoft.AspNetCore.DataProtection.Abstractions' 命名空间。'Microsoft.AspNetCore.DataProtection.Extensions' 用于利用不属于核心包的附加 API。'Microsoft.AspNetCore.Cryptography.KeyDerivation' 用于密码哈希。
使用 API
使用数据保护非常简单。只需导入 'AspNetCore.DataProtection' 和 'Extensions.DependencyInjection' 命名空间,然后使用 *protect()* 方法来保护您的数据(要使用 *protect()* 方法,我们需要使用 *data protection provider* 创建数据保护器),就这样,我们完成了。让我们看看它是如何工作的:
使用 ASP.NET Core 进行加密
加密需要一个 *密钥* 来加密数据,但在这里,密钥由 API 本身创建和维护。这些密钥的默认有效期为 90 天,并存储在一个秘密(也许我们称之为合适)的位置。这个 *密钥* 是临时的,数据保护 API 设计用于保护短期数据,如查询字符串、cookie 等。
请参见下面的片段
using System;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.DependencyInjection;
public class Program
{
public static void Main(string[] args)
{
//use data protection services
var SCollection = new ServiceCollection();
//add protection services
SCollection.AddDataProtection();
var SerPro = SCollection.BuildServiceProvider();
// create an instance of classfile using 'CreateInstance' method
var instance = ActivatorUtilities.CreateInstance<ProClass>(SerPro);
instance.getPutOut();
}
public class ProClass
{
IDataProtector _iPro;
// the 'provider' parameter is provided by DI
public ProClass(IDataProtectionProvider provider)
{
_iPro = provider.CreateProtector("ProClass");
}
public void getPutOut()
{
string input = "Hello World";
// protect string
string protectedString = _iPro.Protect(input);
// protect string
string unProtectedString = _iPro.Unprotect(protectedString);
}
}
}
//output
input : "Hello World"
protectedString : CfDJ8ICcgQwZZhlAlTZT....
unprotectedeString : "Hello World"
在上面的示例中,我们创建了一个 'ServiceCollection' 对象,用于创建和添加数据保护服务,然后我们使用 'CreateInstance' 方法创建我们类的实例。这个方法由 'ActivatorUtilities' 类公开(它是 'Microsoft.Framework.DependencyInjection' 命名空间的一个静态帮助类,它包含一些内置方法,用于处理构造函数参数),最后,我们只需调用 'Protect' 和 'Unprotect' 方法。
** 您注意到这里的一个细节了吗?我们向 'CreateProtector' 方法传递了一个字符串。您知道这个字符串表示什么吗?它被称为“*purpose string*”,基本上用于创建一个隔离的环境。例如,如果我们使用字符串 'ABC' 创建一个保护器并保护数据,那么使用字符串 'XYZ' 创建的保护器就无法解密相同的数据,所以这是使数据更安全的一个进步。
使用 ASP.NET Core 进行哈希
借助 'Microsoft.AspNetCore.Cryptography.KeyDerivation' 包,我们可以使用 ASP.NET Core 实现哈希。它有一个Pbkdf2'方法,该方法使用 'PBKDF2 算法' 来哈希数据。请看下面的代码片段,了解如何使用哈希来保护数据:
using System;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
public class Program
{
public static void Main(string[] args)
{
string SimpleText = "myText";
//Generate a 128-bit salt
//**Salt: it is nothing but a random number
byte[] Slt = new byte[128 / 8];
using (var RandomNum = RandomNumberGenerator.Create())
{
RandomNum.GetBytes(Slt);
}
// Create 256-bit key using HMACSHA1 algorithm with 1000 iterations
string secureHash = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: SimpleText,
salt: Slt,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 1000,
numBytesRequested: 256 / 8));
System.IO.AppendAllText("D:\\hashed.txt", "HashedText : " + secureHash);
}
}
在上面的示例中,我们借助 salt 和 'HMACSHA1' 算法(1000 次迭代)将一个字符串哈希为加密文本。
当前 .NET Framework 的哈希算法有什么问题?
这里的问题是,为什么我需要 ASP.NET Core 来生成哈希字符串?当前 .NET Framework 的哈希算法有什么问题?当前 .NET Framework 有 'Rfc2898DeriveBytes' 类,用于创建哈希字符串,但存在一些限制:
- 它仅支持 HMACSHA1 算法,而 'KeyDerivation.Pbkdf2' 支持 HMACSHA1、HMACSHA256、HMACSHA512。
- 'KeyDerivation.Pbkdf2' 支持基于操作系统的性能改进(基本上它会自动检测操作系统并实现最优化方式)。
- 我们可以指定哈希的输入参数(例如,Salt 值、算法、迭代次数),当前 .NET 哈希类提供了内置的默认值。
在哪里使用此 API
ASP.NET Core 的加密技术非常适合用于客户端状态管理技术,如查询字符串和 Cookie。由于自动生成加密密钥,它在安全方面发挥着重要作用。
ASP.NET Core 的哈希技术非常适合用于存储密码(因为它无法恢复为原始文本)。
参考文献
https://docs.microsoft.com/en-us/aspnet/core/
https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction
最后
ASP.NET Core 提供了一个保护 API,可帮助我们使用加密和哈希技术加密数据。此外,对于加密,密钥由系统本身创建和维护,因此外部干扰被阻止,数据得到进一步保护。
数据安全并非一蹴而就,有很多值得讨论和分享的地方,我们将在后续文章中进行介绍。在此之前,请享受这些加密和哈希要点,并保持安全。
- 快乐安全