Проблема при создании строки аутентификации с использованием PHP HMAC SHA1 и Base64 - PullRequest
0 голосов
/ 10 января 2019

Итак, я работаю с этим API и использую Laravel и пытаюсь создать строку аутентификации. Это документация, которую мне дали, но у меня возникли небольшие проблемы, поскольку это что-то относительно новое для меня.

Вот инструкции автора:

Параметром аутентификации является строка, и он может быть рассчитан вызывающая сторона или вызывающая сторона может сохранить это значение в качестве параметра вместе с идентификатором соединения и ключом API.

Аутентификация - это строка base64 хэша HMAC SHA1. Это вычисляется с использованием двоичного кода API Key in

Формат ########################## в нижнем регистре и кодировка UTF8 в качестве ключа и компьютерного хэша HAAC SHA1 в двоичном файле

Идентификатор соединения в формате ################################ во всех нижних чехол и кодировка UTF8.

Затем двоичный хэш результата кодируется в base64, а текстовый результат что должно быть передано в качестве параметра аутентификации. В C # код для расчета аутентификации может выглядеть так:

HMACSHA1 hmac = new HMACSHA1(
  UTF8Encoding.UTF8.GetBytes(apiKey.ToString("N").ToLower())
);
string authentication = Convert.ToBase64String(
  hmac.ComputeHash(
    UTF8Encoding.UTF8.GetBytes(connectionId.ToString("N").ToLower())
  )
);

В качестве примера приведены следующие учетные данные:

Идентификатор соединения: 5fecbc200f0e4a7cbf41040e11047e56

Ключ API: 2de51c4fd0f04b9fabeb95225e87da70

Должно привести к вычисленному значению аутентификации m5/Vc1RzhUETQvEtx/JdIglQpTg=

Итак, что я пытался:

$a = strtolower('5fecbc200f0e4a7cbf41040e11047e56');
$b = strtolower('2de51c4fd0f04b9fabeb95225e87da70');
$z = hash_hmac("sha1", utf8_encode(decbin($b)), utf8_encode(decbin($a)), true);
dd(base64_encode($z));

Какие выходы QjG3kzUs7U1UukNd++3t24pBWNk=

Я пробовал еще несколько вариантов, но я просто потерян на этом. Первое время действительно расшифровываю или кодирую что угодно. Буду очень признателен за любые советы, идеи или фрагменты, которые могут помочь мне понять это. Уже потратил на это несколько часов, и это меня беспокоит ..

1 Ответ

0 голосов
/ 10 января 2019

Первый: Избавьтесь от utf8_encode() и просто вообще не используйте его. Предполагается, что входной строкой является ISO-88591-1, и если это что-нибудь еще , то данные будут молча повреждены. Эта функция имеет невероятно вводящее в заблуждение имя, и я бы сказал, что никто не должен ее использовать или соответствующий utf8_decode(), который будет ломать ваши данные таким же образом, но в обратном порядке.

Если вам нужно преобразовать строковые кодировки в PHP, используйте что-то, что явно определяет входные и выходные кодировки, например: mb_convert_encoding(). [тебе это все еще не нужно]

Второе: Что бы вы ни думали decbin(), вы ошибаетесь. Он преобразует целое число в буквальную строковую строку S, состоящую из 0 и 1 символов .

Третье: Строки PHP не имеют встроенной кодировки и примерно эквивалентны байтовым массивам, если вы вывернули мою руку для описания. Байты, которые вы вставляете в них, являются байтами, которые вы из них получаете.

Четвертый: Я не совсем эксперт C # [или промежуточный, или даже новичок ], но этот пример кода ужасен. Какое значение имеет N в connectionId.ToString("N")? Я не могу найти документацию по этому поводу.

Начните с простого, используйте значимые имена переменных, создайте и прочитайте документы .

$connectionID = strtolower('5fecbc200f0e4a7cbf41040e11047e56');
$apiKey       = strtolower('2de51c4fd0f04b9fabeb95225e87da70');
$hash         = hash_hmac("sha1", $connectionID, $apiKey, true);
var_dump(base64_encode($hash));

Выход:

string(28) "m5/Vc1RzhUETQvEtx/JdIglQpTg="
...