使用SQL Server列级加密的Entity Framework

17

我需要对几个数据库列进行加密(在Sql Server 2012中)。决定使用基于列的加密(在sql server中实现)。在应用程序方面,我将构建一个基于复杂领域模型的Web API。我真的想利用Entity Framework的Code First方法来维护一个干净的领域模型。这里有没有人有可行的解决方案,不需要回归到存储过程?理想情况下,我希望能够以某种方式操纵Entity Framework生成的SQL,以包装某些字段来执行SQL加密/解密功能。

理想情况下,类似于:

modelBuilder.Entity<MyTable>().ToTable("Table1").Property(p => p.SensativeData).encrypt("keyName",authenticatorFunc);

经过一番搜索,我仍然没有太多关于Entity Framework的选择。另一方面,NHibernate通过字段公式和用户类型来支持读写操作。 - Noel
3个回答

11
在SQL Server 2012中,列级加密主要有两种方法:
  1. 在Entity Framework中定义自定义加密函数。可以参考这篇博客
  2. 在DbContext类中实现SQL单元格级别的加密(先执行打开对称密钥代码),并使用包含指定表中字段解密代码的存储过程检索结果集。可以参考这篇博客
在SQL Server 2016中引入了一个新功能,即始终加密(Always Encrypted),并已在Entity Framework中实现,参考此处

非常感谢。我能够使用第一个博客解决问题,非常有帮助。 - user584018

6

我知道这个已经有点老了,但如果你正在使用Entity Framework Core,我开发了一个Entity Framework Core插件,可以使用自定义属性处理 string 字段的数据加密。实际上,只有AES加密提供程序可用,但您可以轻松实现新的加密提供程序。在这里查看:https://github.com/Eastrall/EntityFrameworkCore.DataEncryption

它与EF Core 2和3兼容。

快速示例:

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);
    }
}

3

Crypteron提供一个免费的Entity Framework适配器CipherDb, 可以与任何SQL Server一起使用。实际上,Crypteron CipherDb可以与任何Entity Framework兼容的数据库一起使用-甚至包括MySQL、PostGreSQL等。

您可以使用[Secure]注释数据模型或将属性命名为Secure_SocialSecurityNumber(其中Secure_是关键部分),CipherDb会自动执行数据加密、篡改保护、安全密钥存储、安全密钥分发、缓存、密钥翻转、ACL等操作。您还可以使用Crypteron来保护流、文件、对象、消息队列、noSQL等。

您可以在GitHub上找到示例应用程序https://github.com/crypteron/crypteron-sample-apps

声明:我在那里工作,我们确实有一个免费的社区版可供任何人使用。


1
你好,不登陆 Crypteon 网站是否可以使用 CipherDB? - TPAKTOPA
@TPAKTOPA 看起来你可以使用 NuGet 包 ChipherDB.EF6。然而,遗憾的是它似乎没有 .Net Standard 支持。 - trigger_segfault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接