4

我在我的VS2010项目中首先使用实体​​框架模型。使用实体框架模型加密密码字段首先

我不知道是否有设置字段password的.edmx窗口或属性窗口可能要被加密的方式。我不想更改生成的.cs文件,因为每次修改模型时都会覆盖它。

+3

你通常不希望密码以可逆式算法进行加密。你想用盐来散列密码。 – PHeiberg 2012-07-30 08:27:43

回答

5

EF没有任何内置的加密支持,它也不支持数据库加密机制(除非您在SQL Server中使用透明加密来加密整个数据库)。

作为一种解决方法,您可以在应用程序中执行集中式加密和解密。这里是高层次的想法:

  • 使用string属性您的加密数据 - 这个属性会在你ObjectContextDbContext被表示为目标数据库
  • 覆盖SaveChanges方法nvarchar列继承了部分类(或处理SavingChanges事件为ObjectContext继承类)。在这种方法中/处理器搜索这些都是AddedModified状态(使用ObjectStateManagerDbChangeTracker)你的实体的所有实例,以从属性,它应该被加密的值,并将其存储加密值加密回以Base64格式属性。如果SaveChanges在您为所有实例加密属性后覆盖呼叫base.SaveChanges
  • 手柄甚至ObjectContext继承类ObjectMaterialized(中的DbContext,你将不得不使用IObjectContextAdapter从您DbContext实例得到ObjectContext实例),从财产采取加密值,它从Base64编码格式转换为字节数组,解密和存储它回到属性。这可能会导致一些其他复杂情况,因为更改属性值可能会导致修改状态,但您应该也可以修复它。
+0

非常感谢! – Ovilia 2012-07-30 08:21:20

+1

我实现了这种方法,只是为了发现在某些情况下,ObjectMaterialized不会触发。这意味着有时你的数据不会被解密。 (就像在使用投影时一样) – 2014-03-30 04:18:57

1

更简单的选项是创建一个部分类,它添加一个处理加密和解密的新属性。然后,您将在代码中引用此新属性,而不是表对象中的Password属性。

Partial Public Class ObjectName 
    Public Property PasswordValue As String 
    Get 
     Return Password.Decrypt() 
    End Get 
    Set(value As String) 
     Password = value.Encrypt() 
    End Set 
    End Property 
End Class 

在这种情况下,我创建的字符串对象的扩展方法来做到这一点。我使用的代码在下面的链接继续做加密和解密:

Encrypt and decrypt a string

+0

虽然这是一个简单的解决方法,但由于您将数据转换逻辑引入到模型中,因此会导致很多问题。根据接受的答案(目前正在研究使用这种方法的代码,它令人发狂)中所建议的,最好留给存储库甚至数据上下文。 – 2014-03-05 20:06:44

+1

我不同意。这种方法对任何实际上不关心加密数据的操作都会有更好的性能。在存储库中加密和解密意味着即使当前操作仅查找诸如用户帐户的名称或电子邮件地址等无害的内容时,也可以实现该操作。这样做,当你实际谈论代码中的密码字段时,你只需要加密/解密命中。 – Mel 2014-12-12 14:50:57

相关问题