节点SHA-256 Base64摘要

我有一个关于Node.jsencryption模块的散列摘要的问题。

通过在命令行上inputhello 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和命令行中产生的hex摘要是相同的( b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 )。 为什么base64编码的摘要有所不同?

对于命令行示例,您将编码stringb94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9作为base64。 Node示例在base64中编码字节0xb9, 0x4d, 0x27, 0xb9 。 这两者是完全不同的。

要查看差异,可能有助于查看hexstring是什么,以字节为单位:

 $ 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 

这与实际的字节序列b927b9 是完全不同的

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

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