2011-03-17 5 views
2

T-SQL을 사용하여 유니 코드 문자열의 SHA1 해시를 계산하려고합니다.T-SQL을 사용하여 'nvarchar'문자열의 SHA1 해시 계산

declare @input varchar(50) 
set @input = 'some text' 
print 'SHA1 Hash: ' + UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)) 

을하지만 declare @input nvarchar(50)와 코드의 첫 번째 라인을 교체 할 때 그것은 잘못된 해시를 계산 : 아래의 코드는 ASCII 문자열과 함께 잘 작동합니다.

Calculated hash (nvarchar): BBA91B680CE2685E9465DE24967E425CF055B10F 
Calculated hash by a tool : 37AA63C77398D954473262E1A0057C1E632EDA77 

가 어떻게이 nvarcharSHA1 해시를 계산할 수있다?

[편집] :

// Computes SHA1 hash of a given string 
string ComputeHash(string input) 
{ 
    string result = string.Empty; 
    byte[] hash; 
    byte[] bytes = Encoding.GetBytes(input); 

    using (var sha = SHA1Managed.Create()) 
     hash = sha.ComputeHash(bytes); 

    foreach (var b in hash) 
     result += b.ToString("X2"); 

    return result; 
} 

답변

6

이 확실 당신의 도구에 의해 반환되는 해시 UTF16 또는 유니 코드 인코딩을 사용하고 있는지 위치 :

C# 코드 아래

내가 해싱을 위해 사용하는 도구와 동일한 해시를 생성 SQL Server에서 반환 한 것과 비교해보십시오 ... SHA1 (및 기타 인코딩 형식)은 데이터 형식에 따라 다르므로 입력으로 제공되면 다른 값을 반환해야합니다. 자세한 설명은 this 링크를 참조하십시오.

+0

편집 참조하십시오 – Xaqron

+1

감사합니다, 유용한 링크. 기사에서 설명하는대로 'HashBytes'와 관련된 알려진 버그입니다. 이제 Microsoft가 국제 표준을 채택하는 것이 왜 그리 좋지 않은지 이해할 수 있습니다. 동일한 회사의 두 팀이 입력 ** 데이터 유형 **에 따라 다르게 해시를 계산할 때 (SQL vs. .NET). – Xaqron

+0

@Xaqron : 예, 정확히 ..... 링크가 도움이 되셨습니다. – Lamak