0

Я пытаюсь создать UserType, который хэширует значение. Проблема, с которой я сталкиваюсь, - это получить доступ к Соле, который сидит в той же таблице.NHibernate: получить доступ к значению другого столбца в UserType

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; 
    } 

Я не уверен в том, как надежно доступа столбца базы данных из тех же таблиц, чтобы получить соль, которая была установлена.

я мог бы сделать что-то вроде этого, чтобы получить доступ к колонку соли:

byte[] saltValueBeingInsertedIntoDB = (IDataParameter)cmd.Parameters[1].Value; 

Это только кажется настолько хрупким, чтобы получить доступ к нему с помощью индекса, так как порядок может измениться. Мне бы это понравилось, если бы я мог получить доступ к нему из имени столбца, но имя столбца (SoureColumn) никогда не заселено.

Как я могу надежно получить доступ к Соле, который существует в cmd.Parameters? Или есть лучший способ? (Я имею полный контроль над тем, чтобы изменить все необходимое, кроме версии NHibernate).

Примечание: Если я устанавливаю соль где-то в другом месте, это может иметь смысл и для хеширования значения в этом месте, а не для использования типа UserType.

NHiberate 2.1.2.4000 Fluent NHibernate 1.1.0.685

+1

В конце концов я бы пошел с вашей запиской. Таким образом, я могу тестировать часть хеширования независимо от NHibernate. – Suhas

ответ

0

Чтобы решить мою проблему, я решил не использовать UserType.

Вместо этого я создаю статический экземпляр моей службы шифрования для требуемого объекта (ов), а затем использую свойство 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; 
     } 
    } 
} 

Обратите внимание, что этот пример не использует соль, но вы должны!