Сценарий Google Apps, эквивалентный PHP hash_hmac() с выводом RAW BINARY?

Мне нужно подключиться к API, используя hash_hmac. В документации PHP для hash_hmac четвертый параметр bool $raw_output определяет, являются ли выходные данные необработанными двоичными данными (true) или шестнадцатеричными символами в нижнем регистре (false). Моя программа работает на PHP, просто установив для этого параметра значение true.

Вот что работает в PHP:

$signature = base64_encode(hash_hmac('SHA256', $signature_string, $private_key, true))

В Google Apps я не могу использовать какие-либо библиотеки javascript (или могу?), но есть эта функция: Utilities.computeHmacSha256Signature https://developers.google.com/apps-script/reference/utilities/utilities#computehmacsha256signaturevalue-key

Однако у него нет опции «true», которая есть у PHP, поэтому он не выводит необработанные двоичные данные.

Как я могу получить то же значение с помощью Google Apps, что и в PHP?

Это то, что у меня есть в Google Apps, но, очевидно, оно не выводит необработанные двоичные данные:

var signature = Utilities.computeHmacSha256Signature(signature_string, private_key);

Я нашел способ преобразовать ответ в шестнадцатеричный (PHP-эквивалент FALSE вместо TRUE, но это не приблизило меня к решению.

// convert to hex 
var signature_in_hex = signature.reduce(function(str,chr) {
chr = (chr < 0 ? chr + 256 : chr).toString(16);
return str + (chr.length==1?'0':'') + chr;
},'');

person dean2020    schedule 07.09.2017    source источник
comment
Возможно, публикация примера вывода как PHP, так и GAppScript поможет нам разобраться в проблеме?   -  person Sammitch    schedule 08.09.2017
comment
Я просто предполагаю, но подача массива байтов, сгенерированного Utilities.computeHmacSha256Signature(), в Utilities.newBlob() делает то, что вам нужно?   -  person Dean Ransevycz    schedule 08.09.2017
comment
Хотя, глядя на stackoverflow.com/questions/17160896/ предполагает, что это не решение...   -  person Dean Ransevycz    schedule 08.09.2017


Ответы (1)


Что сработало для меня, так это просто скопировать эти скрипты прямо в Google Apps:

https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha256.js https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/enc-base64-min.js

А затем используйте:

var hash = CryptoJS.HmacSHA256(signature, private_key);
var base64 = hash.toString(CryptoJS.enc.Base64);

Скрипт: http://jsfiddle.net/c5r78fzm/

person dean2020    schedule 08.09.2017