在实体框架模型类中实现加密

问题描述 投票:0回答:1

这里有一些关键的东西,我们使用.net核心2.0和实体框架核心,所以我们不能在SQL服务器中使用始终加密的列,因为它还不支持。我发现了Asp.net核心的Data Protection API,我一直试图找到一种方法来使用它来加密一些字段。

我发现这篇文章是关于如何将加密添加到选定的字段(link),但它并没有真正处理如何进行实际加密。所以,基本上,我一直在试图找到一种方法将数据保护服务注入我的模型类中,这样我就可以使用Protect和Unprotect方法。

我已经尝试配置我的DI容器(autofac)将其作为属性注入,但DI似乎与实例化EF对象没有任何关系。我也尝试在DbContext的OnModelCreating事件中设置它,但这似乎也不起作用。

也许有人可以告诉我一个更好的方法,或者我的方法都错了?谢谢。

asp.net-core dependency-injection entity-framework-core asp.net-core-2.0
1个回答
1
投票

我知道这是一个古老的主题,但如果您已经将解决​​方案迁移到.NET Core 2.1和EF Core 2.1,那么您可以使用我开发的这个EntityFrameworkCore.DataEncryption库。它是一个EF Core插件,使用内置或自定义加密提供程序为数据库中的加密字段添加支持。目前,它只有用于AES加密的AesProvider,但很快就会添加更多。

要使用它,它非常简单,使用[Encrypted]属性标记您的实体,然后覆盖OnModelCreating()中的DbContext方法并调用modelBuilder.UseEncryption([IEncryptionProvider]);并将其传递给加密提供程序。

例:

public class UserEntity
{
    public int Id { get; set; }

    [Encrypted]
    public string Username { get; set; }

    [Encrypted]
    public string Password { get; set; }

    public int Age { get; set; }
}

public class DatabaseContext : DbContext
{
    // Get key and IV from a Base64String or any other ways.
    // You can generate a key and IV using "AesProvider.GenerateKey()"
    private readonly byte[] _encryptionKey = ...; 
    private readonly byte[] _encryptionIV = ...;
    private readonly IEncryptionProvider _provider;

    public DbSet<UserEntity> Users { get; set; }

    public DatabaseContext(DbContextOptions options)
        : base(options)
    {
        this._provider = new AesProvider(this._encryptionKey, this._encryptionIV);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.UseEncryption(this._provider);
    }
}

保存在数据库中时的结果:

然后,您将在数据库中拥有加密字段,但在您的代码中,您将能够操作纯文本字符串。

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.