SHA-256 NodeJS与.NET C#

时间:2015-01-16 10:27:24

标签: c# node.js

我正在使用带有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版本不匹配。

1 个答案:

答案 0 :(得分:3)

问题是两个系统中使用的编码不匹配,Encoding.Unicode将使用UTF-16格式,而不是UTF-8 - 您仍然需要在NodeJS端进行更新,因为省略了input_encoding参数表示默认为binary。但是,您还需要更新.NET端以使用UTF-8编码

byte[] bytes = Encoding.UTF8.GetBytes(text);

或者,您可以使用未记录的ucs2编码

更新节点端以使用UTF-16
crypto.createHash('sha256').update(text, 'ucs2')

©IronGeek