关于node.js:从Node中的对象生成一致的sha256哈希

Generate a consistent sha256 hash from an object in Node

我有一个对象,想在Node中用sha256进行哈希处理。对象的内容是简单的Javascript类型。例如,假设:

1
2
3
4
5
var payload = {
   "id":"3bab3f00-7d55-11e7-9b0a-4c32759242a5",
   "foo":"a message",
   "version": 7,
};

我创建像这样的哈希:

1
2
3
const crypto = require('crypto');
var hash = crypto.createHash('sha256');
hash.update( ... ).digest('hex');

问题是,通过什么更新? crypto的文档说您可以传递<string> | <Buffer> | <TypedArray> | <DataView>,这似乎表明传递对象不是一件好事。

我不能使用toString(),因为它会打印"[object Object]"。我可以使用JSON.stringify,但是我在其他地方读过,不能保证stringify的输出对于相同的输入是确定性的。

还有其他选择吗?我不想从NPM下载软件包。


正确的术语是"规范的",动作称为"规范化"(我在这里假设为EN-US),您可以在此处找到产生规范输出的字符串。

请注意,您必须确保输出还具有正确的字符集(应首选UTF-8)和行尾。不应存在??虚假数据,例如字节顺序标记或NUL终止字符串足以使哈希值无效。

之后,您可以将其作为string传递。

您当然可以使用任何规范编码。请注意,XML定义了XML-digsig,其中包含在签名生成和签名过程中的规范化,这意味着如果XML代码被更改(即使不更改结构或内容,当然,空格/缩进也不重要),验证甚至会成功。 。

我仍然建议在实现之间甚至库的版本更新之间进行回归测试。