IQuery NHibernate - 我是否必须加密一个加密的IUserType参数?

时间:2010-05-04 15:29:14

标签: nhibernate encryption iusertype

情况:假设我在使用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的参数:

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

问题:有没有更好的方法来执行此查询,利用NHibernate对此加密类型的知识,因此在设置参数时不必执行加密?

1 个答案:

答案 0 :(得分:0)

我错过了什么吗?为什么在发送时需要加密值? IUserType的要点是你封装了原生形式(明文)和持久形式(加密)之间的差异。当您向查询提供纯文本版本时,NHibernate应该调用IUserType.NullSafeSet来加密该值并将查询参数设置为加密值。