我正在使用带有Hex的SHA-256来散列一些文本。但是我发现我的Node实现中的散列文本与我的.NET C#实现不同。
在NodeJS中,我有以下内容:
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应用程序时,哈希值不匹配!
更新:显然这可能是因为charset ......
所以我试过了:
return crypto.createHash('sha256').update(text, 'utf8').digest('hex');
但哈希与以前一样?因此,使用utf8而不是二进制实际上并没有对返回的哈希产生任何影响...而且它仍然与.NET版本不匹配。
答案 0 :(得分:3)
问题是两个系统中使用的编码不匹配,Encoding.Unicode将使用UTF-16
格式,而不是UTF-8
- 您仍然需要在NodeJS端进行更新,因为省略了input_encoding
参数表示默认为binary
。但是,您还需要更新.NET端以使用UTF-8
编码
byte[] bytes = Encoding.UTF8.GetBytes(text);
或者,您可以使用未记录的ucs2
编码
crypto.createHash('sha256').update(text, 'ucs2')
©IronGeek