这里有一些关键的东西,我们使用.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);
}
}
保存在数据库中时的结果:
然后,您将在数据库中拥有加密字段,但在您的代码中,您将能够操作纯文本字符串。
希望能帮助到你。