У меня есть сервер сокетов, написанный на C++, и клиент API на PHP для регистрации новых пользователей в определенных местах. Чтобы проверить запрос от клиента PHP, я буду использовать хэш с HAMC с уникальным ключом, который известен только клиенту API и серверу сокетов.
Клиент PHP отправляет контент как JSON через HTTP POST, после чего Socket Server читает и обрабатывает его. Это нормально работает.
Теперь мои вопросы. У меня есть три поля, которые я буду хешировать: сообщение (строка) objectIDs (целочисленный массив) тип (строка)
Как я могу создать один хеш для этих трех полей? Когда я использую JSON, возможно ли, что строка JSON не имеет такой же сортировки в PHP и C++ (https://github.com/nlohmann/json) или больше вкладок, пробелов или чего-то еще?
И еще в качестве небольшой информации сообщение может содержать любые символы.
В настоящее время я использую это
$str = "type = ".$type. ";message = ".$message;
foreach ($objectIDs as $index => $objectID) {
$str .= ";objectID[" . $index . "] = " . $objectID;
}
//generate from a String a SHA256 hash with HMAC
$hash = getSignature($str);
Кто-то говорит мне, что эта сигнификация не уникальна, и это должно быть возможно со специальным сообщением о том, что система создала неправильный хеш. (Но в настоящее время он недоступен) В своих тестах я не могу это воспроизвести. Теперь я надеюсь, что кто-то другой может мне помочь.






Хэши равны, если равны строки.
То есть аспект того, что JSON - плохой выбор для хеширования, верен: семантически идентичные объекты JSON могут иметь разные строковые представления.
Однако в Интернете следует ожидать, что строковые представления могут быть сложными в зависимости от локали обоих задействованных компьютеров. Если локаль совпадает, обычно все нормально (везде допустим UTF-8). Однако я ожидаю, что PHP преобразует строки в локаль сервера. Это может изменить битовое представление строки (аналогично проблеме с JSON). Поэтому убедитесь, что оба работают в одной и той же локали и что такое волшебство никогда не может повлиять на вашу систему.
Что ж, это куча работы. Поэтому либо убедитесь, что все компоненты используют одинаковую кодировку (например, utf8). iconv может помочь ... php.net/manual/de/function.iconv.php
Нет, я думаю, проблема не в кодировке. Моя проблема в том, что я должен могу отправить сообщение с примером ,, а затем хэш неубедителен. Сказал пользователь. Я жду, пока он не пришлет мне пример, о котором я его просил. Но спасибо за ответ.
Спасибо, это подтверждает мои подозрения. Но как я могу создать для этого уникальный хеш?