Узел 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?
1 ответ
Для примера командной строки вы кодируете строку b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
как base64. Пример Node кодирует байты 0xb9, 0x4d, 0x27, 0xb9
и т.д. в 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
Это сильно отличается от фактической последовательности байтов b9
, 4d
, 27
, b9
и т.п.
РЕДАКТИРОВАТЬ: Чтобы на самом деле получить "правильный" результат в командной строке, вы могли бы вывести фактический двоичный sha256 дайджест и кодировать его, вместо этого:
$ echo -n "hello world"| openssl sha256 -binary | base64 -
uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=