Asp.Net Core Data Protection API 用于保护数据库中的数据

Posted

技术标签:

【中文标题】Asp.Net Core Data Protection API 用于保护数据库中的数据【英文标题】:Asp.Net Core Data Protection API to protect data in database 【发布时间】:2019-01-27 01:26:55 【问题描述】:

我想加密一些机密信息并将其保存到数据库中,然后再解密。

我已经让所有这些工作正常,并且我正在保护和持久化 Aws S3 和 KMS 上的密钥。

这是否允许我无限期地解密数据还是我必须考虑什么?

ConfigureServices 的代码片段 - startup.cs

services.AddSingleton<IAmazonS3>(new AmazonS3Client(RegionEndpoint.EUWest2));
services.AddSingleton<IAmazonKeyManagementService>(new AmazonKeyManagementServiceClient(RegionEndpoint.EUWest2));

services.AddDataProtection()
        .ProtectKeysWithAwsKms(Configuration.GetSection("KmsProtection"))
        .PersistKeysToAwsS3(Configuration.GetSection("S3Persistence"));

var cipherOptions = Configuration.GetSection("CipherOptions");
services.Configure<CipherOptions>(cipherOptions);

services.AddScoped(typeof(ICipherService), typeof(CipherService)); 

CipherService.cs

public class CipherService : ICipherService

    private readonly IDataProtectionProvider dataProtectionProvider;
    private readonly string purpose;

    public CipherService(IDataProtectionProvider dataProtectionProvider, IOptions<CipherOptions> options)
    
        this.dataProtectionProvider = dataProtectionProvider;
        this.purpose = options.Value.Purpose;
    

    public string Encrypt(string input)
    
        var protector = dataProtectionProvider.CreateProtector(purpose);
        return protector.Protect(input);
    

    public string Decrypt(string cipherText)
    
        var protector = dataProtectionProvider.CreateProtector(purpose);
        return protector.Unprotect(cipherText);
    

【问题讨论】:

【参考方案1】:

听起来您几乎是在问加密数据是否有某种时间限制(?)。如果是这样:不,没有。

只要您可以访问加密数据以及解密数据的密钥,那么您就应该能够随时随地解密并阅读它。是的,无限期。

附带说明,您是否将加密数据及其密钥存储在同一个位置并不完全清楚。如果是这样,那可能是个坏主意。如果加密数据的目的是保证其安全,那么将密钥放在它旁边就没有意义了;那么您不妨将其存储为纯文本。

简而言之,只要您的加密足够好,您就可以将数据存储在您喜欢的任何地方;最重要的是您可以在需要时自己访问它。

至于您的密钥,您可能应该将其存储在至少两个不同的地方(冗余以防万一您丢失了一个 - 否则您的数据将永远丢失!),并确保两者都一样安全且不可访问尽可能给其他人。

【讨论】:

我将数据存储在 SQL Server 上,密钥将存储在 Aws S3 存储桶中,该存储桶将由 AWS Key Management Service 加密。我只是在看到这篇文章时才担心 - jakeydocs.readthedocs.io/en/latest/security/data-protection/… 如果您无限期地持久化数据,则不要使用。 嗯,它说它主要打算用于长期持久性,但它仍然是可能的。无论如何,这涉及密钥撤销,我认为如果其他人正在为您加密您的数据(如在 PKI 中,使用一对密钥和公钥),这主要是有意义的。由于您只处理自己的数据私钥,因此我认为该问题与您的情况无关。毕竟,只有当密钥失去完整性并且不再受信任时,才应该发生密钥撤销,这在您的情况下似乎不太可能。 感谢您的快速回复。创建密钥的频率如何?我知道这是 90 天,但我的第一个密钥是在 8 月 19 日创建的,当我今天再次运行应用程序时,它创建了一个新密钥。我不确定它为什么要创建一个新的? 我想这将取决于您的应用程序。我对核心数据保护 API 的细节还不是很熟悉,而且你的问题不包含任何关于你的程序的详细信息,所以很难说这也是我的回答有点笼统的原因。听起来您编写的应用程序每次都使用新生成的密钥来加密数据。如果这不是您想要的,您必须以某种方式输入您现有的密钥,以便您的应用知道使用它。 我已经添加了代码 sn-p,所以你可以看到我在做什么,让我知道吗?【参考方案2】:

我问过类似的问题here。 过期的密钥将始终能够取消保护数据,所以你应该没问题。不知道为什么您的密钥会在默认的 90 天之前重新创建。

【讨论】:

【参考方案3】:

如果您不从密钥库中删除密钥,您应该能够永远解密您的数据。

密钥会在固定的时间内更改(默认为 90 天),因此在此期间之后,如果您加密更多数据,将使用不同的密钥对其进行加密。

See here.

【讨论】:

以上是关于Asp.Net Core Data Protection API 用于保护数据库中的数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Asp.net Core 中使用 Ajax 的验证表单

Asp.Net Core Data Protection API 用于保护数据库中的数据

System.Data.SqlClient.SqlException:与 ASP.NET Core 2.1 和 SQL Server 组合的网络相关或实例 docker

asp.net core mvc 异步表单(Ajax.BeginForm)

我无法在第一个ASP.NET CORE APP上播种数据

无法在 asp.net core EntityFrameworkCore.core 中创建迁移