从Node中的对象生成一致的sha256哈希

我有一个对象,我想在节点sha256散列。 该对象的内容是简单的Javascripttypes。 举例来说,让我们说:

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

我创build一个像这样的散列:

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

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

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

还有其他的select吗? 我不想从NPM下载一个软件包。

正确的术语是“规范的”,行动被称为“规范化”(我在这里假设EN-US),你可以在这里find一个产生规范输出的string化。

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

之后,你可以传递它作为string我想。


你当然可以使用任何规范的编码。 请注意,XML已经定义了XML-digsig,它包含签名生成和签名期间的规范化,这意味着如果更改XML代码(即不改变结构或内容,但是空白/缩进无关紧要),validation甚至会成功。 。


我仍然build议在实现之间进行回归testing,甚至是库的版本更新。