JavaScript base64 encode btoa() vs CryptoJS, почему они отличаются?

Скрипка здесь:

var canonicalString = 'GET'+'\n'
  +'/?a=&b=c'+'\n'
  +'application/json'+'\n'
  +'\n'
  +'Mon, 26 Mar 2007 19:37:58 +0000';

console.log(canonicalString);
canonicalString = CryptoJS.HmacSHA256(canonicalString, 'bar');

console.log(CryptoJS.enc.Base64.stringify(canonicalString));
console.log(btoa(canonicalString.toString()));

Не могу понять, почему результаты разные. Где я не прав? Кстати, правильная версия должна быть btoa().


person gremo    schedule 04.05.2017    source источник
comment
stackoverflow.com/questions/32188149/   -  person enapupe    schedule 04.05.2017
comment
canonicalString.toString() — это строка двоичных данных в шестнадцатеричном формате (canonicalString).   -  person Artjom B.    schedule 05.05.2017
comment
Возможно, вы захотите добавить вывод, который вы получите, к своему вопросу.   -  person Artjom B.    schedule 05.05.2017


Ответы (1)


Используя онлайн-декодер Base64, мы можем увидеть, что ввод был в разных кодировках:

7Sbw7FL9uyWDsrrW+Hi9sjdWoOtHT52Fqp9gfViFW1E=
ED26F0EC52FDBB2583B2BAD6F878BDB23756A0EB474F9D85AA9F607D58855B51

ZWQyNmYwZWM1MmZkYmIyNTgzYjJiYWQ2Zjg3OGJkYjIzNzU2YTBlYjQ3NGY5ZDg1YWE5ZjYwN2Q1ODg1NWI1MQ==
65643236663065633532666462623235383362326261643666383738626462323337353661306562343734663964383561613966363037643538383535623531

В первом случае начальным исходным символом было "E"
Во втором случае начальным исходным символом было "65"

Символ ASCII "E" равен "65" в шестнадцатеричном кодировании.

В этом первом случае закодировано символьное представление, а в случае decomnd закодировано шестнадцатеричное представление. Различные реализации Base64 по-разному обрабатывают входные кодировки.

В вопросе отсутствуют примеры кода, должен быть минимальный, полный и проверяемый пример.

person zaph    schedule 04.05.2017