2017-01-26 2 views
0

Ich versuche, Authentifizierung von der gespeicherten Prozedur in EF verschieben. Das SQL selbst gibt 2 Ergebnisse zurück. Wie sollte ich sie validieren?CONVERT (NVARCHAR (100), HASHBYTES (N'SHA1 ', @ PasswordWithSalt), 2) Entsprechung in C#

Der Wert ist gegenüber dem Wert in der Tabelle

gespeichert zu kontrollierenden
ECC2065575DCBF977CD923996C598C3DC481404E 

SQL-Syntax:

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

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

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

print @PasswordWithSalt 

Ergebnis: 1 Quest_2016LCY'n

print HASHBYTES(N'SHA1', @PasswordWithSalt) 

2: 0xECC2065575DCBF977CD923996C598C3DC481404E-----

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

Ergebnis 3: 0x5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8-----

auch genau das, was, wie dies

sql hashbytes

Antwort

3

Das Problem mit diesen beiden Abfragen in C# implementiert wird, dass die String-Werte gleich sind, aber das Bytes nicht.

Die erste Abfrage

Druck HASHBYTES (N'SHA1' , @PasswordWithSalt)

verwendet Unicode-Codierung die Bytes zu erhalten, so ist jedes Zeichen 2 Bytes (0x510075006500730074005F0032003000310036004C004300590027006E00).

Die zweite Abfrage

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

ASCII verwendet, so dass jedes Zeichen ein Byte ist.

Um das gleiche Ergebnis im zweiten Beispiel zu erhalten, setzen Sie den String mit N' voran. Es wird SQL Server sagen, dass dies ein Unicode-String ist

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

erzeugt den Hash-0xECC2065575DCBF977CD923996C598C3DC481404E

In C# Sie auch und hier verwenden SHA1 den Hash der Zeichenfolge zu bekommen auch müssen Sie

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

druckt ECC2065575DCBF977CD923996C598C3DC481404E über die Byte-Codierung spezifisch sein, aber wenn Sie ändern Encoding.Unicode zu es gibt die 5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8.