4

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

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

4

2 回答 2

5

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

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

  • 为您的加密数据使用string属性 - 此属性将表示为nvarchar目标数据库中的列
  • 覆盖SaveChangesObjectContextDbContext继承的部分类中的方法(或处理继承类SavingChanges的事件ObjectContext)。在此方法/处理程序中搜索处于AddedModified状态(使用ObjectStateManagerDbChangeTracker)的实体的所有实例,从应加密的属性中获取值,对其进行加密并将加密值以 Base64 格式存储回属性。如果在您加密所有实例的属性后进行SaveChanges覆盖调用。base.SaveChanges
  • ObjectMaterialized甚至在继承的类上处理ObjectContext(在 DbContext 中,您必须使用从您的实例IObjectContextAdapter中获取实例),从属性中获取加密值,将其从 Base64 格式转换为字节数组,解密并将其存储回属性。这可能会导致一些其他并发症,因为更改属性值可能会导致修改状态,但您也应该能够修复它。ObjectContextDbContext
于 2012-07-30T08:15:26.670 回答
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

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

加密和解密字符串

于 2013-09-25T13:16:29.300 回答