針對某些數據字段要保存敏感數據的情況,比如銀行卡號,我們需要使用一種機制保證存儲到數據庫的數據是加密的,避免數據泄露風險,但是又能夠正常讀取出來顯示。
下面我們用MySql演示如何操作。
創建一個ConsoleApp1,然后引用下列NuGet包:
- EntityFrameworkCore.DataEncryption
- Pomelo.EntityFrameworkCore.MySql
假設數據表User已創建好,包含3個字段:
- Id 主鍵
- Name 姓名
- BankCard 銀行賬戶
創建User類,在BankCard
上我們加了EncryptedAttribute
,表示這個字段需要加密:
public class User { public int Id { get; set; } public string Name { get; set; } [Encrypted] public string BankCard { get; set; } }
創建DefaultDbContext,在構造函數創建IEncryptionProvider
實例,並在OnModelCreating
方法中UseEncryption
:
public class DefaultDbContext: DbContext { private readonly byte[] _encryptionKey = ...; private readonly byte[] _encryptionIV = ...; private readonly IEncryptionProvider _provider; public DefaultDbContext() { this._provider = new AesProvider(this._encryptionKey, this._encryptionIV); } public DbSet<User> User { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.UseEncryption(this._provider); base.OnModelCreating(modelBuilder); } }
現在,讓我們增加幾個User:
DefaultDbContext context = new DefaultDbContext(); User zhangsan = new User { Id = 1, Name = "張三", BankCard = "12345" }; User lisi = new User { Id = 2, Name = "李四", BankCard = "67890" }; context.User.AddRange(zhangsan, lisi); context.SaveChanges(); var users = context.User.ToList(); foreach (var user in users) { Console.WriteLine($"{user.Id} {user.Name} {user.BankCard}"); }
可以看到輸出正常
但是數據庫里保存的是加密后的數據
原文鏈接:https://mp.weixin.qq.com/s/h78BfykDLUKAJE_9ClU5pg