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