我有一个对象,我想在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下载包。
答案 0 :(得分:2)
正确的术语是“规范的”,行为称为“规范化”(我假设这里是EN-US),你可以找到一个产生规范输出的字符串here。
请注意,您必须确保输出也具有正确的字符集(首选UTF-8)和行结尾。不应存在虚假数据,例如:字节顺序标记或NUL终止字符串足以使散列值无效。
之后,您可以将其作为string
传递给我。
您当然可以使用任何规范编码。请注意,XML已经定义了XML-digsig,它包含在签名生成和签名期间的规范化 ,这意味着如果XML代码被更改,验证甚至会成功(当然,不会改变结构或内容,但是空格/缩进无关紧要。)
我仍然建议在实现之间进行回归测试,甚至是库的版本更新。