2015-01-16 1 views
0

일부 텍스트를 해시하는 데 16 진수와 함께 SHA-256을 사용하고 있습니다. 그러나 내 Node 구현의 해시 된 텍스트가 .NET C# 구현과 다릅니다. NodeJS에서SHA-256 NodeJS 대 .NET C#

나는 다음과 같은 한 :

return crypto.createHash('sha256').update(text).digest('hex'); 

및 .NET의 C#에서

나는이 :

private static string Hash(string text) 
{ 
    byte[] bytes = Encoding.Unicode.GetBytes(text); 

    using (var generator = new SHA256Managed()) 
    { 
     byte[] hash = generator.ComputeHash(bytes); 
     return BytesToHex(hash); 
    } 
} 

private static string BytesToHex(byte[] bytes) 
{ 
    var hex = new StringBuilder(bytes.Length * 2); 
    foreach (byte b in bytes) 
    { 
     hex.AppendFormat("{0:x2}", b); 
    } 

    return hex.ToString(); 
} 

return Hash(text); 

은 내가 NodeJS 버전에서 잘못된 무슨 짓을 한거야?

즉, .NET 응용 프로그램에서 만든 해시로 NodeJS 응용 프로그램을 사용하려고하면 해시가 일치하지 않습니다.

업데이트 :

return crypto.createHash('sha256').update(text, 'utf8').digest('hex'); 

그러나 해시는 이전과 동일합니다 : 분명히이

그래서 나는 시도 ... 캐릭터 세트에 의한 될 수 있을까? 따라서 바이너리 대신에 utf8을 사용하여 실제로 반환 된 해시에 아무런 차이가 없으며 .NET 버전과 여전히 일치하지 않습니다.

+0

일부 텍스트를 포함한 실행 가능한 repro를 게시하십시오. – usr

+0

FWIW [업데이트] (http://nodejs.org/api/crypto.html#crypto_hash_update_data_input_encoding)/[다이제스트] (http://nodejs.org/api/crypto.html#crypto_hash_digest_encoding)는 기존 방법이므로, ([해시] (http://nodejs.org/api/crypto.html#crypto_class_hash)가 다이제스트를 내부적으로 수행합니다). – James

답변

3

문제는 Encoding.Unicode하지 UTF-8UTF-16 형식을 사용하는 시스템 모두에 사용 인코딩이 일치합니다 - input_encoding 매개 변수를 생략하는 것이 binary에 기본 의미대로 NodeJS 측에서 만든 업데이트가 여전히 필요합니다. 그러나, 당신은 또한

byte[] bytes = Encoding.UTF8.GetBytes(text); 

또는 UTF-8 인코딩을 사용하는 .NET 측을 업데이트해야합니다, 당신은 ucs2 인코딩, 문서화의 사용 UTF-16을 사용하는 노드 측을 업데이트 할 수 있습니다

crypto.createHash('sha256').update(text, 'ucs2') 

© IronGeek

+0

NodeJS에서 UTF-16을 사용할 수 있습니까? – Cameron

+0

@Cameron은 [docs] (http://nodejs.org/api/crypto.html#crypto_hash_update_data_input_encoding)에 따라 유일하게 지원되는 인코딩 유형은'utf8','ascii' 또는'binary'입니다. – James

+0

감사합니다. 우리가 UTF-16 하하에 코딩 된 해시로 가득 찬 DB를 ​​가지고 있기 때문에 다소 짜증이납니다. 그러나 Node를 위해서도 이것을 작동 시키려면 스위치를해야 할 것입니다. 다시 한번 감사드립니다. – Cameron