2011-01-31 2 views
0

Использование this code на стороне JavaScript иJavaScript хэш и эквивалентный алгоритм .NET

Using sha As New SHA256Managed 
     Using memStream As New MemoryStream(Encoding.ASCII.GetBytes("Hello World!")) 
      Dim hash() As Byte = sha.ComputeHash(memStream) 
      Dim res As String = Encoding.Default.GetString(hash) 
     End Using 
    End Using 

я не смог воссоздать тот же хэш для одних и тех же значений, с этими двумя битами кода.

Реализация JavaScript возвращает 7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069, а пример VB.NET возвращает ƒ±eñüS¹-ÁH¡Ö]ü-K£Öw(JÝÒ mi".

Что мне не хватает? Я предполагаю, что это как-то связано с кодировкой символов?

Решение: это был один простое изменение:

Using sha As New SHA256Managed 
     Using memStream As New MemoryStream(Encoding.ASCII.GetBytes("Hello World!")) 
      Dim hash() As Byte = sha.ComputeHash(memStream) 
      Dim res As String = BitConverter.ToString(hash) 
     End Using 
    End Using 

ответ

1

Вы обработки hash массив в виде последовательности ASCII-символов. Вам необходимо шестнадцатеричное представление вместо, который вы можете получить с помощью BitConverter.ToString, что-то вроде этого:

Dim res As String = BitConverter.ToString(hash).Replace("-", "").ToLower(); 
+0

Спасибо за помощь! –

1

Я не знаю, достаточно, чтобы обеспечить VB кода, но проблема заключается в том, что вы лечите массив байтов в качестве закодированной строки и пытается расшифровать его , Фактически вы должны преобразовать массив байтов в шестнадцатеричную строку. См. Например, here.

0

Они в основном то же самое ... вы можете увидеть: How do you convert Byte Array to Hexadecimal String, and vice versa?

Вы можете использовать его, чтобы преобразовать строку обратно в шестнадцатеричном представлении его.

пример, чтобы доказать это работает так же, см:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Cryptography; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var sha = new SHA256Managed()) 
      { 
       using (var stream = new MemoryStream(
        Encoding.ASCII.GetBytes("Hello World!"))) 
       { 
        var hash = sha.ComputeHash(stream); 
        var result = Encoding.Default.GetString(hash); 

        //print out each byte as hexa in consecutive manner 
        foreach (var h in hash) 
        { 
         Console.Write("{0:x2}", h); 
        } 
        Console.WriteLine(); 

        //Show the resulting string from GetString 
        Console.WriteLine(result); 
        Console.ReadLine(); 
       } 
      } 
     } 
    } 
} 
+0

или просто 'строку гекс = String.Concat (hash.Select (х => x.ToString ("x2"))); '. Не уверен, что такое эквивалент VB. – LukeH

Смежные вопросы