在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
答案 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();
}
}
}
}
}