Sql server 首先使用实体框架模型加密密码字段

Sql server 首先使用实体框架模型加密密码字段,sql-server,visual-studio-2010,entity-framework,ef-model-first,Sql Server,Visual Studio 2010,Entity Framework,Ef Model First,我在VS2010项目中首先使用实体框架模型 我想知道是否有办法在.edmx窗口或属性窗口中设置要加密的字段password。我不想更改生成的.cs文件,因为每次修改模型时都会覆盖它 EF没有任何内置的加密支持,也不支持数据库加密机制(除非您在SQL Server中使用透明加密,它将加密整个数据库) 作为一种解决方法,您可以在应用程序中进行集中加密和解密。这是一个高层次的想法: 对加密数据使用字符串属性-此属性将在目标数据库中表示为nvarchar列 在继承的部分类中重写ObjectContex

我在VS2010项目中首先使用实体框架模型


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

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

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

  • 对加密数据使用
    字符串
    属性-此属性将在目标数据库中表示为
    nvarchar
  • 在继承的部分类中重写
    ObjectContext
    DbContext
    中的
    SavingChanges
    方法(或为继承的类处理
    ObjectContext
    事件)。在此方法/处理程序中,搜索处于
    已添加
    已修改
    状态的实体的所有实例(使用
    ObjectStateManager
    DbChangeTracker
    ),从应加密的属性中获取值,对其进行加密,并以Base64格式将加密值存储回属性。如果
    SaveChanges
    在加密所有实例的属性后重写调用
    base.SaveChanges
  • 即使在继承的类上处理
    ObjectMaterialized
    (在DbContext中,您必须使用
    IObjectContextAdapter
    DbContext
    实例中获取
    ObjectContext
    实例),从属性中获取加密值,将其从Base64格式转换为字节数组,将其解密并存储回属性。这可能会导致其他一些复杂情况,因为更改属性值可能会导致修改状态,但您也应该能够修复它

    • 一个更简单的选择是创建一个分部类,该分部类添加一个处理加密和解密的新属性。然后在代码中引用这个新属性,而不是在表对象中引用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
      
      在本例中,我在string对象上创建了扩展方法来实现这一点。我使用以下链接中的代码进行加密和解密:


      您通常不希望使用可反转算法对密码进行加密。你想用salt散列密码。虽然这是一个简单的解决方法,但这可能会导致很多问题,因为你将数据转换逻辑引入到你的模型中。这最好留给存储库,甚至是公认答案中建议的数据上下文(目前正在编写使用这种方法的代码,这让人恼火)。我不同意。这种方法对于实际上不关心加密数据的任何操作都具有更好的性能。在存储库中进行加密和解密意味着即使当前操作只是寻找一些无害的东西,比如用户帐户的名称或电子邮件地址,也要进行加密和解密。这样做的话,只有当你在代码中真正谈论密码字段时,你才会受到加密/解密的打击。我实现了这种方法,结果发现在某些情况下,ObjectMaterialized不会触发。这意味着有时您的数据不会被解密。(如使用投影时)