我试图制作一个散列值的UserType。我遇到的问题是访问位于同一个表中的Salt。
void IUserType.NullSafeSet(IDbCommand cmd, object value, int index)
{
object paramVal = DBNull.Value;
if (!String.IsNullOrEmpty((string)value))
{
paramVal = ComputeHash((string)value, saltBytes?);
}
IDataParameter parameter = (IDataParameter)cmd.Parameters[index];
parameter.Value = paramVal;
}
我不确定如何可靠地访问同一个表的数据库列以获取已设置的salt。
我可以做这样的事情来访问盐柱:
byte[] saltValueBeingInsertedIntoDB = (IDataParameter)cmd.Parameters[1].Value;
通过索引访问它似乎太脆弱了,因为订单可能会改变。如果我能从列名中访问它,我会喜欢它,但是从不填充列名(SoureColumn)。
如何可靠地访问cmd.Parameters中存在的Salt?或者,还有更好的方法? (除了NHibernate版本之外,我完全可以控制所需的内容。)
注意:如果我在其他地方设置salt,那么我也可以在该位置散列值,而不是使用UserType。
NHiberate 2.1.2.4000 流利的NHibernate 1.1.0.685
答案 0 :(得分:0)
为解决我的问题,我选择不使用UserType。
相反,我在需要它的对象上创建了一个静态的Ciphering服务实例,然后使用helper属性来获取/设置加密值。这对我很有用。
public class Consumer
{
static Consumer()
{
CipherConsumerSsnService = new CipherConsumerSsnService();
}
public static ICipherConsumerSsnService CipherConsumerSsnService { get; set; }
public virtual long ID { get; private set; }
public virtual byte[] SSN { get; protected set; }
public virtual string GetDecryptedSsnOrSetSsnValueAndEncryptIt
{
get
{
return SSN != null ? CipherConsumerSsnService.Decrypt(SSN) : null;
}
set
{
SSN = value != null ? CipherConsumerSsnService.Encrypt(value) : null;
}
}
}
请注意,此示例并未使用盐,但您应该使用!