Я подключаюсь к API рекламы продукта Amazon и подписываю свой запрос. Мне нужно, чтобы base64-кодировал необработанный двоичный вывод хеша HMAC-SHA256.
В документации PHP для hash_hmac четвертый параметр bool $raw_output
контролирует, являются ли выходные данные необработанными двоичными данными (true) или нижними строками (false). Моя программа работает в PHP, просто устанавливая этот параметр в true.
Тем не менее, я теперь пытаюсь передать это Javascript. Я попытался использовать функцию CryptoJS.HmacSHA256 (), но, похоже, он возвращает строчные шестнадцатеричные символы. Как я могу преобразовать это в двоичный?
Я пробовал следующее в соответствии с документацией CryptoJS, но оба выхода идентичны:
var hash = CryptoJS.HmacSHA256("hello", "key"); console.log(hash.toString()); console.log(hash.toString(CryptoJS.enc.Base64));
Это объясняется в их документации . Попробуй это:
var hash = CryptoJS.HmacSHA256("Message", "Secret Passphrase"); var base64 = hash.toString(CryptoJS.enc.Base64);
Для этого вам необходимо включить http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js . Если вы не включили это, CryptoJS.enc.Base64
будет undefined
и отменит значение по умолчанию.
Рабочая демонстрация: http://jsfiddle.net/ak5Qm/
PHP-код
echo base64_encode(hash_hmac('SHA1', 'shanghai', '0', true).'beijing');
выход php
xvBv49PpaYvXAIfy3iOSDWNQj89iZWlqaW5n
код узла
var crypto = require('crypto'); var buf1 = crypto.createHmac("sha1", "0").update("shanghai").digest(); var buf2 = Buffer.from('beijing'); console.log(Buffer.concat([buf1, buf2]).toString('base64'));
вывод узла
xvBv49PpaYvXAIfy3iOSDWNQj89iZWlqaW5n