Google-App-Script против php в кодировке base64
Этот 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 перед хэшированием, они возвращают тот же результат. Но для этой конкретной цели ключ должен быть декодирован. Переменная message - это просто мое имя "Parit" на случай, если кто-то захочет скопировать.
1 ответ
Я думал так Utilities.computeHmacSignature()
может быть невозможно использовать [] байт для значения. В качестве обходного пути, как насчет использования jsSHA? Я думаю, что в вашем случае вы можете использовать https://github.com/Caligatio/jsSHA/blob/master/src/sha512.js.
Процесс использования jsSHA заключается в следующем.
Поток:
- Загрузите sha512.js.
- В редакторе сценариев создайте новый сценарий, например, имя файла
sha512.js
,- Скопируйте и вставьте скрипт 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==