这里有两件事,我们使用的是.net core 2.0和实体框架核心,因此我们无法使用SQL Server中始终加密的列,因为尚不支持该列。我发现了Asp.net核心的数据保护API,并且我一直在尝试寻找一种使用它来加密一些字段的方法。
我找到了这篇关于如何向选定的字段(link添加加密)的文章,但实际上并没有涉及如何进行实际的加密。 因此,基本上,我一直在尝试寻找一种将Data Protection服务注入到我的模型类中的方法,以便可以使用Protect和Unprotect方法。
我尝试配置DI容器(autofac)以将其作为属性注入,但是DI似乎与实例化EF对象没有任何关系。我还尝试在DbContext的OnModelCreating事件中进行设置,但这似乎也不起作用。
也许有人可以告诉我这样做的更好方法,还是我的方法是错误的? 谢谢。
答案 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);
}
}
保存到数据库中的结果:
然后,您将在数据库中拥有加密的字段,但是在您的代码中,您将能够操纵纯文本字符串。
希望有帮助。