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

时间:2018-06-22 18:39:00

标签: asp.net-core dependency-injection entity-framework-core asp.net-core-2.0

这里有两件事,我们使用的是.net core 2.0和实体框架核心,因此我们无法使用SQL Server中始终加密的列,因为尚不支持该列。我发现了Asp.net核心的数据保护API,并且我一直在尝试寻找一种使用它来加密一些字段的方法。

我找到了这篇关于如何向选定的字段(link添加加密)的文章,但实际上并没有涉及如何进行实际的加密。 因此,基本上,我一直在尝试寻找一种将Data Protection服务注入到我的模型类中的方法,以便可以使用Protect和Unprotect方法。

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

也许有人可以告诉我这样做的更好方法,还是我的方法是错误的? 谢谢。

1 个答案:

答案 0 :(得分:1)

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

使用它非常简单,使用[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);
    }
}

保存到数据库中的结果:

fields_encrypted

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

希望有帮助。