JavaScript哈希和等效的.NET算法

时间:2011-01-31 09:57:23

标签: c# javascript asp.net vb.net hash

在JavaScript端使用this code

    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 个答案:

答案 0 :(得分:1)

我不知道VB提供足够的代码,但问题是您将字节数组视为编码字符串并尝试解码它。您实际上应该将字节数组转换为十六进制字符串。例如,请参阅here

答案 1 :(得分:1)

您将hash数组视为ASCII字符序列。您需要使用十六进制表示,您可以使用BitConverter.ToString获取,如下所示:

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

答案 2 :(得分: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();
                }
            }
        }
    }
}