【发布时间】:2014-04-08 17:28:39
【问题描述】:
我一直在尝试并未能找到一种使用 Entity Framework Code First 加密 SQL 数据的好方法。我必须以我在 Azure 中托管并且无权访问本机 SQL 加密作为开头。
从SecurEntity 获取一个页面,我已经完全实现了一种利用 SaveChanges 和 ObjectMaterialized 来处理实体的加密/解密的方法,但在测试中我发现这太不可靠了。
这里是一些实现的示例:
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);
}
我看过其他通过辅助属性手动加密/解密的帖子,如下所示:
public Value { get; set; }
[NotMapped]
public DecryptedValue
{
get { return Decrypt(this.Value); }
set { this.Value = Encrypt(value); }
}
这肯定会奏效,但我发现这种方法……不太理想。使用这种方法时,所有开发人员都必须遍历所有加密属性以找到他们可以使用的属性。
最理想的解决方案是让我能够在数据访问级别覆盖每个值的获取/设置。有没有办法做到这一点?如果没有,我如何使用 Entity Framework - Code First 实现数据加密,以便易于维护和使用?
【问题讨论】:
-
请注意,SecurEntity 的当前实现有一个致命的安全漏洞,这意味着从证书生成的密钥实际上从未使用过。有关快速而肮脏的修复,请参阅securentity.codeplex.com/workitem/7376
标签: c# entity-framework azure encryption ef-code-first