2017-01-26 15 views
0

私はストアドプロシージャからEFに認証を移動しようとしています。 SQL自体が2つの結果を返しています。どのように私はそれらを検証する必要がありますか?CONVERT(NVARCHAR(100)、HASHBYTES(N'SHA1 '、@ PasswordWithSalt)、2)はC#で同等です

値がテーブルに格納された値と照合する

ECC2065575DCBF977CD923996C598C3DC481404E 

SQL構文:

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

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

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

print @PasswordWithSalt 

結果:1 Quest_2016LCY'n

print HASHBYTES(N'SHA1', @PasswordWithSalt) 

結果2:0xECC2065575DCBF977CD923996C598C3DC481404E-----

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

結果3:0x5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8-----

これら2つのクエリに問題が文字列の値が同じであるが、バイトがあるということです、これはC#で

sql hashbytes

答えて

3

を実装する方法もまさにない。

最初のクエリ

印刷HASHBYTES(N'SHA1' 、@PasswordWithSalt)

はバイトを取得するために、Unicodeのエンコーディングを使用していますので、すべての文字が2バイト(0x510075006500730074005F0032003000310036004C004300590027006E00)です。

2番目のクエリ

印刷HASHBYTES(N'SHA1' 、 'Quest_2016LCY''n')

すべての文字が1バイトであるように、ASCIIを使用しています。

2番目の例で同じ結果を得るには、文字列にN'という接頭辞を付けます。それは

はあなたがC#ではハッシュ0xECC2065575DCBF977CD923996C598C3DC481404E

を生成し、これが

印刷HASHBYTES(N'SHA1' 、N'Quest_2016LCY''n ')Unicode文字列であるSQLサーバーを教えてくれますまた、文字列のハッシュを取得するためにSHA1を使用してもここであなたは

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

プリントECC2065575DCBF977CD923996C598C3DC481404Eが、場合バイトエンコーディングに関する特定する必要がありますすることができますEncoding.Unicodeをに変更すると、5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8となります。

関連する問題