javascript - Node SHA-256 Base64 摘要

标签 javascript node.js digest

我对 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 编码为 base64。 Node 示例以 base64 编码字节 0xb9、0x4d、0x27、0xb9 etc.。两者截然不同。

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

$ 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

这与实际的字节序列b9, 4d, 27, b9

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

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

关于javascript - Node SHA-256 Base64 摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35155089/

相关文章:

node.js - tslint 方法返回类型文档

Java MessageDigest MD5 未返回预期结果

javascript - Eclipse - 使用 html 标签格式化 javascript 时出错

javascript - Push Function To Array 将数组转换为数字

javascript - 在文本字段的最大长度上调用 javascript 函数

node.js - 如何调试 NodeJS 进程保持事件的原因

java - HttpClient 4.1.1 在使用 NTLM 进行身份验证时返回 401,浏览器工作正常

ruby-on-rails - password_hash/password_salt 与 password_digest

javascript - jQuery 函数不在条件循环中触发

javascript - 是否可以定义一个解析对象并使其在所有路由中可用?