EntityFrameworkCore-EF Core加密儲存資料
阿新 • • 發佈:2021-08-06
針對某些資料欄位要儲存敏感資料的情況,比如銀行卡號,我們需要使用一種機制保證儲存到資料庫的資料是加密的,避免資料洩露風險,但是又能夠正常讀取出來顯示。
下面我們用MySql演示如何操作。
建立一個ConsoleApp1,然後引用下列NuGet包:
- EntityFrameworkCore.DataEncryption
- Pomelo.EntityFrameworkCore.MySql
假設資料表User已建立好,包含3個欄位:
- Id 主鍵
- Name 姓名
- BankCard 銀行賬戶
建立User類,在BankCard
上我們加了EncryptedAttribute
,表示這個欄位需要加密:
publicclass 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}"); }
可以看到輸出正常
但是資料庫裡儲存的是加密後的資料
龍騰一族至尊龍騎