JS 和 shell 之间的 MD5 哈希不同

MD5 hash differs between JS and shell

我正在尝试生成 base64 编码的 MD5 哈希。

在Javascript中,我有:

const crypto = require('crypto');
const utf8 = require('utf8');

const hash = crypto.createHash('md5');
const bodyData = JSON.stringify({ message: 'Hello world' });

hash.update(utf8.encode(bodyData)).digest('base64');

导致:

jANzQ+rgAHyf1MWQFSwvYw==

尝试在 shell 中做同样的事情,我有:

echo -n '{"message":"Hello world"}' \
    | iconv -t utf-8 \
    | md5sum \
    | cut -d' ' -f1 \
    | base64

导致:

OGMwMzczNDNlYWUwMDA3YzlmZDRjNTkwMTUyYzJmNjMK

我错过了什么?为什么我得到的结果与使用 Javascript 得到的结果不同?

NodeJS 代码 returns Base64 编码的 MD5 散列,而 md5sum returns the hex encoded MD5 hash, which is then Base64 encoded because of the following base64.

要获得 NodeJS 代码的结果,必须先对十六进制编码的哈希值进行十六进制解码,然后再进行 Base64 编码。

这可以通过 xxd -r -p 实现。总体:

echo -n '{"message":"Hello world"}' | iconv -t utf-8 | md5sum | cut -d' ' -f1 | xxd -r -p | base64

输出:

jANzQ+rgAHyf1MWQFSwvYw==