javascript – 节点SHA-256 Base64摘要

我有一个关于Node.js加密模块的哈希摘要的问题.

通过命令行上的输入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等进行编码.两者完全不同.

要查看差异,可能有助于查看十六进制字符串是什么,以字节为单位:

$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=
上一篇:java – HttpClient 4.1.1在使用NTLM进行身份验证时返回401,浏览器工作正常


下一篇:Zookeeper分布式入门——ZK命令行【ACL权限控制(二)】