2010-05-04 44 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

相关问题