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

时间:2017-08-09 22:59:00

标签: node.js hash cryptography sha256

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

JSON.parse

我创建了这样的哈希:

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

问题是,要更新的内容是什么? documentation for crypto表示您可以传递const crypto = require('crypto'); var hash = crypto.createHash('sha256'); hash.update( ... ).digest('hex'); ,这似乎表明对象不是一件好事。

我无法使用<string> | <Buffer> | <TypedArray> | <DataView>,因为它会打印toString()。我可以使用JSON.stringify,但我在其他地方读过,stringify的输出不能保证对同一输入是确定性的。

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

1 个答案:

答案 0 :(得分:2)

正确的术语是“规范的”,行为称为“规范化”(我假设这里是EN-US),你可以找到一个产生规范输出的字符串here

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

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

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

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