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 🙂