65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET Core 中的数据安全

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.10/5 (9投票s)

2016年11月22日

CPOL

8分钟阅读

viewsIcon

28190

本文将介绍如何使用数据保护 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 提出了以下安全策略:

  1. 开发一个配置需求较少的数据安全系统。
  2. 密钥逻辑不应向开发人员公开,开发人员甚至无法访问原始密文。
  3. 加密密钥应由系统本身维护和保护。

为了满足所有要求,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,可帮助我们使用加密和哈希技术加密数据。此外,对于加密,密钥由系统本身创建和维护,因此外部干扰被阻止,数据得到进一步保护。

数据安全并非一蹴而就,有很多值得讨论和分享的地方,我们将在后续文章中进行介绍。在此之前,请享受这些加密和哈希要点,并保持安全。

- 快乐安全

 

© . All rights reserved.