【发布时间】:2016-02-02 13:40:14
【问题描述】:
我对 Node.js Crypto 模块的哈希摘要有疑问。
在命令行中输入hello world 会生成base64 编码的sha256:
$ echo -n "hello world"|shasum -a256|base64 -
Yjk0ZDI3Yjk5MzRkM2UwOGE1MmU1MmQ3ZGE3ZGFiZmFjNDg0ZWZlMzdhNTM4MGVlOTA4OGY3YWNlMmVmY2RlOSAgLQo=
在 Node.js (0.12.9) 上执行相同操作(据我所知)会产生完全不同的结果:
var crypto = require("crypto");
var shasum = crypto.createHash("sha256");
shasum.update("hello world", "utf-8");
shasum.digest("base64");
// 'uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek='
在 Node 和命令行中产生的十六进制摘要是相同的 (b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9)。为什么 base64 编码的摘要有差异?
【问题讨论】:
-
你得到的摘要是
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9吗? -
@Joost 十六进制摘要,是的。
-
由于我没有时间进行测试,因此无法回答此问题,但是 shasum -a256 是否可以输出十六进制,那么您是对十六进制进行base64编码吗?您的 node.js 示例直接从二进制转换为 base64,二进制 -> base64 将给出与二进制 -> 十六进制 -> base64 不同的结果。 (编辑:好的,事实证明 Git bash 确实带有这些工具;我会回答这个问题)
-
您编辑了答案中的字符串以使用大写字母
H。我建议您撤消该编辑,因为它与仍然使用带有小写 h 的hello world的答案(以及您提供的摘要)相结合会非常混乱。 -
@Joost 好点。我的初衷是使用“Hello world”。快速的响应时间让我感到惊讶。我撤消了编辑。
标签: javascript node.js digest