Przejdź do treści

EF Core – szyfrowanie

  • przez

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 🙂