Ho cercato e non riesco a capire un buon approccio alla crittografia dei dati SQL con il codice Entity Framework Primo. Devo prefigurare questo con quello che sto ospitando in Azure e non ho accesso alla crittografia SQL nativa.Come crittografare i dati in Entity Framework Code Innanzitutto?
Prendendo una pagina da SecurEntity, ho completamente implementato un approccio che utilizza SaveChanges e ObjectMaterialized per gestire la crittografia/decrittografia delle entità, ma in fase di test ho trovato che questo è stato troppo inaffidabile da usare.
Ecco un esempio di alcune delle applicazione:
public override int SaveChanges()
{
var pendingEntities = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
.Where(en => !en.IsRelationship).ToList();
foreach (var entry in pendingEntities) //Encrypt all pending changes
EncryptEntity(entry.Entity);
int result = base.SaveChanges();
foreach (var entry in pendingEntities) //Decrypt updated entities for continued use
DecryptEntity(entry.Entity);
return result;
}
void ObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
{
DecryptEntity(e.Entity);
}
Ho visto altri post che cifrano manualmente/decifrare tramite proprietà secondarie, in questo modo:
public Value { get; set; }
[NotMapped]
public DecryptedValue
{
get { return Decrypt(this.Value); }
set { this.Value = Encrypt(value); }
}
Questo sarà sicuramente lavoro, ma trovo che questo approccio sia ... meno che ideale. Quando si utilizza questo approccio, tutti gli sviluppatori devono guadare attraverso tutte le proprietà crittografate per trovare quelli che possono usare.
La soluzione ideale sarebbe per me essere in grado di ignorare l'acquisizione/impostazione di ciascun valore al livello di accesso ai dati. C'è un modo per fare questo? In caso contrario, come posso implementare la crittografia dei dati con Entity Framework - Code First in modo che sia facile da gestire e gestire?
Tenere presente che l'attuale implementazione di SecurEntity presenta un errore di sicurezza irreversibile, il che significa che la chiave generata dal certificato non viene mai utilizzata. Per una soluzione rapida e sporca, vedere https://securentity.codeplex.com/workitem/7376 –