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 перед хешированием, они возвращают тот же результат. Но для этой конкретной цели ключ нужно декодировать. Переменная сообщения - это просто мое имя «Парит» на случай, если кто-то захочет повторить репликацию.

они такие же, когда вы регистрируете ключ после декодирования Base64? может быть проблема с utf8 / non-utf8?

Kaddath 13.03.2018 10:08

эхо $ BDAPI_SECRET_KEY; вернуть то же, что и Logger.log (Utilities.newBlob (BDSecret) .getDataAsString ());

Parit Sripakdeevong 13.03.2018 10:24

Вам нужен Utilities.newBlob(BDSecret).getDataAsString(), чтобы получить BDSecret в виде строки? если да, то не должно ли это быть и в аргументах computeHmacSignature (согласно документу, ключевой аргумент - это строка)? Еще вы можете попробовать передать computeHmacSignature четвертый аргумент, чтобы попытаться указать другую кодировку.

Kaddath 13.03.2018 12:25

вы правы, GAS декодирует в исходный массив октетов, а php декодирует в текст (ASCII). Проблема в том, что некоторые исходные октеты отрицательны, что не переводится ни во что в ASCII.

Parit Sripakdeevong 13.03.2018 17:18

[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]

Parit Sripakdeevong 13.03.2018 17:19

Мой ответ показал вам результат, которого вы хотите? Не могли бы вы рассказать мне об этом? Если у вас еще есть проблемы с моим ответом, не стесняйтесь сообщить мне об этом. Хочу учиться решать ваши вопросы.

Tanaike 05.05.2018 11:11

Согласно недавнему обновлению Google, байтовый массив можно использовать для Utilities.computeHmacSignature(). Итак, я обновил свой ответ. Не могли бы вы это подтвердить?

Tanaike 24.06.2018 10:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
338
1

Ответы 1

Я подумал, что Utilities.computeHmacSignature() не сможет использовать [] байт для значения. Как насчет использования jsSHA в качестве обходного пути? Думаю, что в вашем случае можно использовать https://github.com/Caligatio/jsSHA/blob/master/src/sha512.js.

Процесс использования jsSHA следующий.

Поток :

  1. Скачайте sha512.js.
  2. В редакторе сценариев создайте новый сценарий, например, с именем файла sha512.js.
    • Скопируйте и вставьте скрипт sha512.js в созданный скрипт.
  3. Скопируйте и вставьте образец сценария в Code.gs редактора сценариев.
  4. Запустите 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 24.04.2018 10:57

@pomo Да. У меня тоже была такая же ситуация. Итак, я использовал этот метод. Я рад, что ваша проблема решена. И тебе спасибо.

Tanaike 25.04.2018 00:45

@pomo Согласно недавнему обновлению Google, байтовый массив можно использовать для Utilities.computeHmacSignature(). Итак, я обновил свой ответ. Не могли бы вы это подтвердить?

Tanaike 24.06.2018 10:18

Другие вопросы по теме