【问题标题】:Entity Framework column encryption issue实体框架列加密问题
【发布时间】:2013-09-19 13:49:31
【问题描述】:

我正在尝试使用SecurEntity 为我的应用程序中的某些表实现列加密。

我正在使用依赖注入将 DbContext 的单个实例注入到我的所有存储库中。

DbContext 类有一个附加到 SaveChanges 事件处理程序的事件,如果正在保存的更改保存在应加密的对象上,则该事件处理程序调用 SecurEntity Encrpyt 方法。

还有一个附加到 ObjectMaterialized 事件处理程序的事件,该事件处理程序在最初从数据库中检索加密对象时对其进行解密。

当我在登录期间调试应用程序时,用户对象(应加密的表之一)、用户对象从数据库中检索并成功解密。然后它会更新一些属性,例如上次登录日期,这些更改会保存并成功加密。

我的问题是稍后在登录过程中,再次检索 User 对象,但它没有触发 ObjectMaterialized 事件,因此它没有被解密。

我认为这是因为由于依赖注入而使用了单个 DbContext,并且实体框架已经有一个正在跟踪的实例。

有没有人知道如何解决这个问题?我正在开发一个将托管在 Azure 上的应用程序,因此透明数据加密不是我的选择,我需要实现某种形式的加密。

【问题讨论】:

  • 请注意,SecurEntity 的当前实现有一个致命的安全漏洞,这意味着从证书生成的密钥实际上从未使用过。有关快速而肮脏的修复,请参阅securentity.codeplex.com/workitem/7376

标签: c# azure encryption entity-framework-5


【解决方案1】:

Web 应用程序不应保留 DbContext 实例。 DbContext 应该在请求期间生存和死亡(也就是在请求完成后立即处置)。检查您的依赖注入是如何配置的,在任何情况下都不应将其配置为使用 DbContext 作为单例(整个应用程序的单个实例)。

【讨论】:

  • 感谢您的回复巴里萨。我正在使用 Ninject 并将其配置为使用“InRequestScope”。我相信这意味着该实例是根据 HTTP 请求创建的。我应该避免这种情况吗?
猜你喜欢
  • 2011-05-02
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2013-07-17
  • 1970-01-01
相关资源
最近更新 更多