2017-01-26 3 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-----

이는 두 쿼리의 문제는 문자열 값이 동일한 지입니다

sql hashbytes

답변

3

C#으로 구현하지만, 바이트는 할 수있는 방법 또한 그냥 뭐 아니.

인쇄 HASHBYTES 쿼리 (N'SHA1 '@PasswordWithSalt)

가 바이트를 얻을 유니 인코딩을 사용 정도로 모든 문자 2 바이트 (0x510075006500730074005F0032003000310036004C004300590027006E00)이다. 모든 문자가 1 바이트되도록

가 ASCII를 사용하여 (N'SHA1 ','Quest_2016LCY''n ')

번째 쿼리

인쇄 HASHBYTES.

두 번째 예제에서 동일한 결과를 얻으려면 문자열 앞에 N'을 붙입니다. 이것이 유니 코드 문자열을

인쇄 HASHBYTES (N'SHA1 ', N'Quest_2016LCY''n')

는 C#에서 해시 0xECC2065575DCBF977CD923996C598C3DC481404E

을 생산하고 있습니다 SQL 서버를 말할 것이다 당신 또한

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하지만 경우 바이트 인코딩에 대한 특정 할 필요도 여기에 문자열의 해시를 얻을하고 SHA1을 사용할 수 있습니다 Encoding.Unicode을 으로 변경하면 5E85AB2ED11CDB696BC0544131D7C8571F4F8FA8이됩니다.