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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在实体框架模型类中实现加密相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

我知道这是一个古老的主题,但如果您已经将解决​​方案迁移到.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);
    }
}

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

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

希望能帮助到你。

以上是关于在实体框架模型类中实现加密的主要内容,如果未能解决你的问题,请参考以下文章

添加新实体标量时实体框架 4 映射片段错误

如何使用trackerenableddbcontext在asp.net mvc5和代码中的实体框架中实现审计跟踪

实体框架返回值操作

是否可以使用实体框架在 SQL Server CE 中实现 CommitMode.Immediate

在片段中实现 onClickListener

如何在使用 TPT 层次结构时首先在 EF 代码中实现并发