从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,甚至是库的版本更新。