2017-01-26 1 views
0

J'essaie de déplacer l'authentification de la procédure stockée vers EF. Le SQL lui-même renvoie 2 résultats. Comment devrais-je les valider?CONVERT (NVARCHAR (100), HASHBYTES (N'SHA1 ', @PasswordWithSalt), 2) équivalent en C#

La valeur doit être vérifiée par rapport à la valeur stockée dans la table

ECC2065575DCBF977CD923996C598C3DC481404E 

syntaxe SQL:

Declare @Password AS NVARCHAR(256) = 'Quest_2016' 

DECLARE @PasswordSalt AS NVARCHAR(5) = 'LCY''n' 

DECLARE @PasswordWithSalt AS NVARCHAR(261) = @Password + @PasswordSalt 

print @PasswordWithSalt 

résultats: 1 Quest_2016LCY'n

print HASHBYTES(N'SHA1', @PasswordWithSalt) 

résultat 2: 0xECC2065575DCBF977CD923996C598C3DC481404E-----

print HASHBYTES(N'SHA1', 'Quest_2016LCY''n') 

Résultat 3: 0x5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8-----

aussi tout ce que la façon dont cela peut être mis en œuvre en C#

sql hashbytes

Répondre

3

Le problème avec ces deux requêtes est que les valeurs de chaîne sont les mêmes mais les octets sont ne pas.

La première requête

de HASHBYTES d'impression (N'SHA1' , @PasswordWithSalt)

utilise l'encodage unicode pour obtenir les octets de sorte que chaque caractère est 2 octets (0x510075006500730074005F0032003000310036004C004300590027006E00).

La deuxième requête

impression HASHBYTES (N'SHA1' , 'Quest_2016LCY''n')

utilise ASCII de sorte que chaque caractère est un octet.

Pour avoir le même résultat dans le deuxième exemple, préférez la chaîne avec N'. Il dira serveur SQL que ceci est une chaîne unicode

HASHBYTES d'impression (N'SHA1' , N'Quest_2016LCY''n ')

produit le hachage 0xECC2065575DCBF977CD923996C598C3DC481404E

En C# vous peut également utiliser SHA1 pour obtenir le hachage de la chaîne et ici aussi vous devez être précis sur le codage des octets

byte[] data = Encoding.Unicode.GetBytes(@"Quest_2016LCY'n"); 
byte[] hash = SHA1.Create().ComputeHash(data); 
Console.Write(hash.Select(x=>x.ToString("X2")).Aggregate((x,y)=>x+y)); 

imprime ECC2065575DCBF977CD923996C598C3DC481404E mais si vous changez Encoding.Unicode à il donne le 5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8.