2016-03-10 1 views
2

J'utilise la classe SHA512Managed pour coder la chaîne de mot de passe utilisateur. Je crée initialally chaîne d'étalon codée de la façon suivante:Comment comparer efficacement deux valeurs de hachage SHA512Managed

  1. Convertir la chaîne de mot de passe (par exemple "Johnson_ # 1") en tableau d'octets;
  2. Récupère la valeur de hachage de ce tableau d'octets à l'aide de la méthode SHA512Managed.ComputeHash . Comme vous le savez, la valeur de hachage obtenue à partir de la méthode SHA512Managed.ComputeHash (byte []) est également un tableau d'octets.

Ensuite (en boucle de programme) Je convertir ce tableau d'octets de hachage à la chaîne de la manière suivante:

System.Text.StringBuilder sBuilder = new System.Text.StringBuilder(); 
for (int i = 0; i < passwordСache.Length; i++) 
{ 
    sBuilder.Append(passwordСache[i].ToString("x2")); 
} 
string passwordCacheString = sBuilder.ToString(); 

où le passwordСache est un tableau d'octets hachage et passwordCacheString est une chaîne de résultat.

Enfin, je stocke la chaîne de résultats dans la table de base de données MS SQL Server en tant que chaîne etalon. Le problème est dans la suite: Si j'appelle périodiquement la méthode SHA512Managed.ComputeHash (byte []) et lui passe chaque fois le même tableau d'octets comme paramètre d'entrée (par exemple obtenu de la chaîne "Johnson_ # 1"), alors le contenu du tableau d'octets de hachage retourné sera différent de temps en temps. Donc, si je convertis un tel tableau de hachage en chaîne (comme je l'ai montré ci-dessus) et compare cette chaîne à la chaîne etalon qui se trouve dans la table de base de données, alors le contenu de cette chaîne différera chaîne ("Johnson_ # 1") sous-tend.

mieux défini la question

Ma question est: Yat-il un moyen de déterminer que deux par rapport tableaux d'octets de hachage SHA512Managed avec des contenus différents ont été créés sur la base de la même chaîne? L'aide de Yuor sera grandement appréciée.

+0

* alors le contenu du tableau d'octets de hachage retournée sera différente de temps à autre *: ** cela est absolument impossible **. Une fonction de hachage est déterministe. Même entrée -> même sortie. Vous faites une erreur ailleurs. L'erreur classique est dans la façon dont vous convertissez le 'string' en' byte [] '. – xanatos

+0

Le résultat SHA512Managed hash byte [] ne peut donc pas varier son contenu de temps en temps si la même chaîne est sous-jacente? –

+2

Ce serait totalement inutile sinon. – xanatos

Répondre

-1

Comme xanatos mentionné dans ses commentaires, les fonctions de hachage doivent être déterministes. C'est pour la même entrée, vous obtiendrez la même sortie de hachage.

Essayez par vous-même:

  SHA512Managed sha512Managed = new SHA512Managed(); 

      for (int i = 0; i < 1000; i++) { 
       var input = Guid.NewGuid().ToString(); 
       byte[] data = sha512Managed.ComputeHash(Encoding.UTF8.GetBytes(input)); 
       byte[] data2 = sha512Managed.ComputeHash(Encoding.UTF8.GetBytes(input)); 

       if (Encoding.UTF8.GetString(data) != Encoding.UTF8.GetString(data2)) { 
        throw new InvalidOperationException("Hash functions as we know them are useless"); 
       } 
      } 
+0

Je l'ai essayé. Aucune exception n'a été levée. Encoding.UTF8.GetString (data) et Encoding.UTF8.GetString (data2) sont égaux. –

+0

Encoding.UTF8.GetString ne fournira pas de résultat significatif sur les données aléatoires. – usr

+0

Alors, comment puis-je obtenir un résultat significatif? Que devrais-je utiliser pour l'obtenir? –