Chciałbym Ci pokazać w jaki sposób możemy zaszyfrować dane w EF Core.
Na potrzeby tego artykułu stworzę aplikację konsolową, która przy użyciu EF Core zapisze nowy rekord dla klasy Person w bazie danych. Zamierzam zaszyfrować dane osobowe (imię, nazwisko i email). Aby to zrobić musimy dodać do projektu poniższe biblioteki:
EntityFrameworkCore.JamieEncryptColumn Microsoft.EntityFrameworkCore MySql.EntityFrameworkCore
Aby dodać kolumnę zaszyfrowaną musimy ją oznaczyć za pomocą atrybutu EncryptColumn
public class Person
{
public Guid Id { get; set; }
[EncryptColumn]
[Required]
public string FirstName { get; set; } = string.Empty;
[EncryptColumn]
[Required]
public string LastName { get; set; } = string.Empty;
[EncryptColumn]
[Required]
public string Email { get; set; } = string.Empty;
}
Teraz w DbContext musimy użyć IEncryptionProvider tak jak poniżej (na potrzeby tej aplikacji tworzę klasę DemoContext)
using EntityFrameworkCore.EncryptColumn.Extension;
using EntityFrameworkCore.EncryptColumn.Interfaces;
using EntityFrameworkCore.EncryptColumn.Util;
using Microsoft.EntityFrameworkCore;
namespace EFCoreEncrypt;
public class DemoContext : DbContext
{
private readonly IEncryptionProvider _encryptionProvider;
public DbSet<Person> Persons { get; set; }
public DemoContext()
{
_encryptionProvider = new GenerateEncryptionProvider("abcdef123456abcdef123456abcdef12");
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL("server=localhost;port=3310;database=db;user=user;password=password");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.UseEncryption(_encryptionProvider);
modelBuilder.Entity<Person>(entity => entity.ToTable("People"));
}
}
Dla testów w Program.cs dodaję i odczytuję dane:
using EFCoreEncrypt;
using var dbContext = new DemoContext();
dbContext.Database.EnsureCreated();
dbContext.Persons.Add(new Person { Id = Guid.NewGuid(), FirstName = "A", LastName = "B", Email = "abc@gmail.com" });
dbContext.SaveChanges();
foreach (var person in dbContext.Persons)
{
Console.WriteLine($"{person.Id}: {person.FirstName} {person.LastName}");
}
Wynik działania programu:

Wygląda ok, po zapisaniu danych możemy je odczytać. Natomiast w bazie dane wyglądają tak:

Jak można zauważyć dane są zaszyfrowane w bazie danych 🙂