SHA-256节点与.NET C#

SHA-256节点与.NET C#,c#,node.js,C#,Node.js,我正在使用SHA-256和十六进制来散列一些文本。但是,我发现我的节点实现中的哈希文本与.NETC#实现中的不同 在NodeJS中,我有以下内容: return crypto.createHash('sha256').update(text).digest('hex'); 在.NET C#中,我有: 我在NodeJS版本中做错了什么 因为这意味着当我尝试使用我的NodeJS应用程序和我的.NET应用程序创建的哈希值时,哈希值不匹配 更新:显然这可能是由于字符集… 所以我试着: return c

我正在使用SHA-256和十六进制来散列一些文本。但是,我发现我的节点实现中的哈希文本与.NETC#实现中的不同

在NodeJS中,我有以下内容:

return crypto.createHash('sha256').update(text).digest('hex');
在.NET C#中,我有:

我在NodeJS版本中做错了什么

因为这意味着当我尝试使用我的NodeJS应用程序和我的.NET应用程序创建的哈希值时,哈希值不匹配

更新:显然这可能是由于字符集…

所以我试着:

return crypto.createHash('sha256').update(text, 'utf8').digest('hex');

但是散列和以前一样吗?因此,使用utf8而不是二进制实际上并没有对返回的哈希产生任何影响。。。它仍然与.NET版本不匹配。

问题是两个系统中使用的编码不匹配,将使用
UTF-16
格式,而不是
UTF-8
-仍然需要在NodeJS端进行更新,因为省略
输入编码
参数意味着它将默认为
二进制
。但是,您还需要更新.NET端以使用
UTF-8
编码

byte[] bytes = Encoding.UTF8.GetBytes(text);
crypto.createHash('sha256').update(text, 'ucs2')

或者,您可以使用未记录的
ucs2
编码更新节点端以使用UTF-16

byte[] bytes = Encoding.UTF8.GetBytes(text);
crypto.createHash('sha256').update(text, 'ucs2')

©IronGeek

发布包含一些文本的可执行复制。FWIW/是传统方法,您应该直接将文本写入流中(将在内部执行摘要)。是否可以将UTF-16与NodeJS一起使用?@Cameron根据说明,唯一支持的编码类型是
utf8
ascii
binary
。好的,谢谢。这有点烦人,因为我们有一个用UTF-16编码的数据库,哈哈,但我想我们必须切换它们才能让这个节点工作。再次感谢。@Cameron这只是Node附带的
Crypto
lib……我会仔细研究一下NPM,你可能会发现有一个lib确实支持UTF-16。@Cameron尝试使用
Crypto.createHash('sha256').update(文本,'ucs2')
来匹配.NET Unicode编码