0

J'essaie de créer un UserType qui hache une valeur. Le problème que j'ai est d'avoir accès au sel qui se trouve dans la même table.NHibernate: Accéder à la valeur d'une autre colonne dans un 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; 
    } 

Je suis incertain sur la façon de fiable accès une colonne de base de données de la même table pour obtenir le sel qui a été fixé.

que je pouvais faire quelque chose comme ceci pour accéder à la colonne de sel:

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

Il semble si fragile pour y accéder via l'index, que l'ordre pourrait changer. J'adorerais que je puisse y accéder à partir du nom de la colonne, mais le nom de la colonne (SoureColumn) n'est jamais renseigné.

Comment puis-je accéder de manière fiable au sel qui existe dans cmd.Parameters? Ou y a-t-il un meilleur moyen? (J'ai le plein contrôle pour changer tout ce qui est nécessaire, sauf la version NHibernate).

Remarque: Si je place le sel ailleurs, il peut être judicieux de hacher la valeur à cet endroit plutôt que d'utiliser un UserType.

NHiberate 2.1.2.4000 Courant NHibernate 1.1.0.685

+1

J'aurais tendance à aller avec votre 'note' à la fin. De cette façon, je peux tester la partie de hachage indépendamment de NHibernate. – Suhas

Répondre

0

Pour résoudre mon problème, je choisi de ne pas utiliser le UserType. Au lieu de cela, je crée une instance statique de mon service de chiffrement sur les objets qui en ont besoin, puis j'utilise une propriété helper pour obtenir/définir la valeur chiffrée. Cela fonctionne très bien pour moi.

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

Notez que cet exemple ne pas utiliser un sel, mais vous devriez!