Этот php-код декодирует секретный ключ перед хешированием с помощью SHA 512
$API_SECRET_KEY = "W0+m0Dc9GMN9yDVeq3GMDsJ49WasEhQHkNHNuDw3wNg = ";
$BDAPI_SECRET_KEY=base64_decode($API_SECRET_KEY);
$HMAC_SIGN = base64_encode(hash_hmac('sha512',$MESSAGE,$BDAPI_SECRET_KEY,true));
echo $HMAC_SIGN;
BfVNi21gY09c8M18cWBRBgo1W9pAlXM99ZVoF7Kz2ETFnIuvXjj8NRvRgn/GaT/m6YJ8efsr5s9EDbIhznAaag==
Я хочу воспроизвести это в скрипте приложения Google
var Secret = "W0+m0Dc9GMN9yDVeq3GMDsJ49WasEhQHkNHNuDw3wNg = "
var BDSecret= Utilities.base64Decode(Secret)
var hmac = Utilities.base64Encode(Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, BDSecret ));
Logger.log(hmac)
ew5KhLWSJixn8zw4s6VkpYIwvGBjrmjY3LhNWZr9CVEw6W22LOGg+lVzA3uQgOVyICSCffw2bzTepnBdoYtldw==
Если я не декодирую API перед хешированием, они возвращают тот же результат. Но для этой конкретной цели ключ нужно декодировать. Переменная сообщения - это просто мое имя «Парит» на случай, если кто-то захочет повторить репликацию.
эхо $ BDAPI_SECRET_KEY; вернуть то же, что и Logger.log (Utilities.newBlob (BDSecret) .getDataAsString ());
Вам нужен Utilities.newBlob(BDSecret).getDataAsString(), чтобы получить BDSecret в виде строки? если да, то не должно ли это быть и в аргументах computeHmacSignature (согласно документу, ключевой аргумент - это строка)? Еще вы можете попробовать передать computeHmacSignature четвертый аргумент, чтобы попытаться указать другую кодировку.
вы правы, GAS декодирует в исходный массив октетов, а php декодирует в текст (ASCII). Проблема в том, что некоторые исходные октеты отрицательны, что не переводится ни во что в ASCII.
[91, 79, -90, -48, 55, 61, 24, -61, 125, -56, 53, 94, -85, 113, -116, 14, -62, 120, -11, 102, - 84, 18, 20, 7, -112, -47, -51, -72, 60, 55, -64, -40]
Мой ответ показал вам результат, которого вы хотите? Не могли бы вы рассказать мне об этом? Если у вас еще есть проблемы с моим ответом, не стесняйтесь сообщить мне об этом. Хочу учиться решать ваши вопросы.
Согласно недавнему обновлению Google, байтовый массив можно использовать для Utilities.computeHmacSignature(). Итак, я обновил свой ответ. Не могли бы вы это подтвердить?






Я подумал, что Utilities.computeHmacSignature() не сможет использовать [] байт для значения. Как насчет использования jsSHA в качестве обходного пути? Думаю, что в вашем случае можно использовать https://github.com/Caligatio/jsSHA/blob/master/src/sha512.js.
Процесс использования jsSHA следующий.
sha512.js.
Code.gs редактора сценариев.myFunction() примера сценария.function myFunction() {
var message = "Parit";
var secret = "W0+m0Dc9GMN9yDVeq3GMDsJ49WasEhQHkNHNuDw3wNg = ";
var obj = new jsSHA("SHA-512", "TEXT");
obj.setHMACKey(secret, "B64");
obj.update(message);
Logger.log(obj.getHMAC("B64"))
}
Parit на message, я получил BfVNi21gY09c8M18cWBRBgo1W9pAlXM99ZVoF7Kz2ETFnIuvXjj8NRvRgn/GaT/m6YJ8efsr5s9EDbIhznAaag==.Извините, это вам не пригодилось.
Согласно обновлению Google от 19 июня 2018 г., Utilities.computeHmacSignature() получил возможность использовать байтовые массивы. Таким образом, используя только собственный скрипт Google Apps Scvript, результат можно получить без использования jsSHA. Поэтому я хотел бы обновить свой ответ.
function myFunction() {
var message = "Parit";
var secret = "W0+m0Dc9GMN9yDVeq3GMDsJ49WasEhQHkNHNuDw3wNg = ";
var value = Utilities.base64Decode(Utilities.base64Encode(message));
var key = Utilities.base64Decode(secret);
var out = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, value, key);
var res = Utilities.base64Encode(out)
Logger.log(res)
}
BfVNi21gY09c8M18cWBRBgo1W9pAlXM99ZVoF7Kz2ETFnIuvXjj8NRvRgn/GaT/m6YJ8efsr5s9EDbIhznAaag==
Спасибо. Это решение сработало для меня. Код GAS (Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512...) не дает такой же подписи, как несколько других библиотек, которые я пробовал.
@pomo Да. У меня тоже была такая же ситуация. Итак, я использовал этот метод. Я рад, что ваша проблема решена. И тебе спасибо.
@pomo Согласно недавнему обновлению Google, байтовый массив можно использовать для Utilities.computeHmacSignature(). Итак, я обновил свой ответ. Не могли бы вы это подтвердить?
они такие же, когда вы регистрируете ключ после декодирования Base64? может быть проблема с utf8 / non-utf8?