【问题标题】:Implementing encryption in entity framework model classes在实体框架模型类中实现加密
【发布时间】:2018-12-02 06:49:29
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    要使用它,它非常简单,使用[Encrypted] 属性标记您的实体,然后覆盖DbContext 中的OnModelCreating() 方法并调用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);
        }
    }
    

    保存到数据库时的结果:

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

    希望对你有帮助。

    【讨论】:

    • 假设 SYMMETRIC KEY 已经在数据库中,并且由 CERTIFICATE 打开。如何修改它以使用已经存在的密钥?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多