2010-05-04 52 views
1

情況:假設我有它在數據庫中使用IUserType加密對實體列:IQuery NHibernate - 我必須加密一個加密的IUserType參數嗎?

public class EncryptedStringUserType : IUserType 
{ 

    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     object r = rs[names[0]]; 
     if (r == DBNull.Value) 
      return null; 
     return CryptoProvider.Instance.Decrypt((string) r); 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     object paramVal = DBNull.Value; 
     if (value != null) 
      paramVal = CryptoProvider.Instance.Encrypt((string) value); 
     IDataParameter parameter = (IDataParameter)cmd.Parameters[index]; 
     parameter.Value = paramVal; 
    } 

    // Other IUserType members as usual.. 
} 

正如上文由Ayende自己: http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx

現在查詢時,使用的NHibernate IQUERY接口,我需要我傳遞到查詢參數進行加密:

query.SetString("DbEncryptedParameter", 
    CryptoProvider.Instance.Encrypt(UnencryptedValueObject.ToString())); 

問題:有沒有更好的方法來執行這個查詢,利用NHibernate對這種加密類型的知識,所以在設置參數時不需要執行加密?

+0

不能解決這個問題,但是這是一個更新的加密的usertype:http://gustavoringel.blogspot.com/2009/02/encrypting-password-or-other-strings-in.html – 2010-05-05 23:31:34

+0

謝謝,我已經看到一。它跟上面的差不多。不想添加其他依賴項,所以堅持我自己的解決方案。 – Rick 2010-05-06 08:24:20

回答

0

我錯過了什麼嗎?爲什麼在發送時需要加密值? IUserType的意義在於你封裝了本機窗體(明文)和持久窗體(加密)之間的區別。當你爲查詢提供純文本版本時,NHibernate應該調用IUserType.NullSafeSet來加密值並將查詢參數設置爲加密值。

+0

你試過這個還是知道這個?我會說這也很合理,但它似乎並不是這樣。 – Rick 2010-10-12 17:25:11

+0

僅僅因爲您正在使用加密/解密,這與使用基於IUserType的轉換的任何其他屬性到字段轉換沒有區別。最簡單的例子是內置的YesNoType,它將字符串保存爲字符串(YES或NO)。當您與查詢或Linq交互時,您基於POCO定義進行交互,而不是數據庫定義。這就是IUserType的重點。 – Rich 2010-10-13 15:27:00

相關問題