Хэш JavaScript и эквивалентный алгоритм .NET - PullRequest
0 голосов
/ 31 января 2011

Используя этот код на стороне JavaScript и

    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

Ответы [ 3 ]

1 голос
/ 31 января 2011

Вы рассматриваете массив hash как последовательность символов ASCII.Вместо этого вам нужно шестнадцатеричное представление, которое вы можете получить, используя BitConverter.ToString, примерно так:

Dim res As String = BitConverter.ToString(hash).Replace("-", "").ToLower();
1 голос
/ 31 января 2011

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

0 голосов
/ 31 января 2011

Это в основном одно и то же ... вы можете захотеть увидеть: Как преобразовать массив байтов в шестнадцатеричную строку и наоборот?

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

Пример того, как это работает, см .:

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();
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...