【问题标题】:Node SHA-256 Base64 Digest节点 SHA-256 Base64 摘要
【发布时间】: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


【解决方案1】:

对于命令行示例,您将字符串 b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 编码为 base64。 Node 示例将字节 0xb9, 0x4d, 0x27, 0xb9 etc. 编码为 base64。两者完全不同。

要查看差异,查看十六进制字符串(以字节为单位)可能会有所帮助:

$ echo -n "hello world" | shasum -a256 | hexdump
0000000 3962 6434 3732 3962 3339 6434 6533 3830
0000010 3561 6532 3235 3764 6164 6437 6261 6166
0000020 3463 3438 6665 3365 6137 3335 3038 6565
0000030 3039 3838 3766 6361 3265 6665 6463 3965

这与实际的字节序列b94d27b9等有很大不同。

编辑: 为了在命令行上真正获得“正确”的结果,您可以输出一个实际的二进制 sha256 摘要并对其进行编码,而不是:

$ echo -n "hello world"| openssl sha256 -binary | base64 -
uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=

【讨论】:

  • 所以要产生相同的结果,我应该对 sha256 十六进制摘要进行 base64 编码?
  • 是的,这会产生相同的结果,但这不是好方法。秒,我会更新我的答案。
猜你喜欢
  • 2011-10-15
  • 2015-06-18
  • 2012-12-31
  • 2022-07-04
  • 2011-03-02
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2015-03-18
相关资源
最近更新 更多