Хэш sha1 разный в зависимости от того в каких кавычках строка?

Ссылка скопирована
PHP
1 ответ

Есть вот такой кусок кода

$data = addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"');         return hash("sha1", $data . $this->secretKey);

$data = addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"'); return hash("sha1", $data . $this->secretKey);

$secret_key = '9fff8c602b08b00323567be0001480f6'
$data = "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}"

если заменить $data строкой, то есть вот так

return hash("sha1", "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}" . $this->secretKey);

return hash("sha1", "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}" . $this->secretKey);

То при разных кавычках то есть:

"{"order_id": "FACTPRECHR152632", "amount": "8300.00"}"

"{"order_id": "FACTPRECHR152632", "amount": "8300.00"}"

и

'{"order_id": "FACTPRECHR152632", "amount": "8300.00"}'

'{"order_id": "FACTPRECHR152632", "amount": "8300.00"}'

получается разный результат.
Собственно у меня при вот таком коде получается не тот результат который нужен
return hash("sha1", $data . $this->secretKey);
Как решить такое не понимаю...
ВАЖНОЕ УТОЧНЕНИЕ:
У меня нет строки с какими либо кавычками, просто результат выполнения кода

$data = addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"');         return hash("sha1", $data . $this->secretKey);

$data = addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"'); return hash("sha1", $data . $this->secretKey);

равен

return hash("sha1", '{"order_id": "FACTPRECHR152632", "amount": "8300.00"}' . $this->secretKey);

return hash("sha1", '{"order_id": "FACTPRECHR152632", "amount": "8300.00"}' . $this->secretKey);

И не равен

return hash("sha1", "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}" . $this->secretKey);

return hash("sha1", "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}" . $this->secretKey);

И как сделать так чтобы результат выполнения был равен второму не понятно.

Дополнительно:

что-то я не понимаю смысла всех этих манипуляций, если нужно вставить в код на PHP, то можно использовать NOWDOC

и кавычки работают ровно так написано в мануале на той же странице, т.е. """ будет содержать ", а '"' будет содержать "

  • Вопрос не в кавычках. Вопрос в том почему при выполнении
    $data = addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"');         return hash("sha1", $data . $this->secretKey);

    $data = addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"'); return hash("sha1", $data . $this->secretKey);

    я получаю хеш как если бы в $data была строка в одинарных кавычках а не как если бы в двойных.
    Строки в кавычках у меня нет у меня есть переменная в которой результат

    addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"')

    addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"')

    И строки в кавычках приведены для примера

  • А зачем вам экранирование " внутри одиночных кавычек '?
    Строка:

    "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}"

    "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}"

    аналогична строке:

    '{"order_id": "FACTPRECHR152632", "amount": "8300.00"}'

    '{"order_id": "FACTPRECHR152632", "amount": "8300.00"}'

    Могли бы хотя бы stlen()-ом это выяснить.

    Да даже банальный

    if ("{"order_id": "FACTPRECHR152632", "amount": "8300.00"}" != '{"order_id": "FACTPRECHR152632", "amount": "8300.00"}') die("ERROR!!!");

    if ("{"order_id": "FACTPRECHR152632", "amount": "8300.00"}" != '{"order_id": "FACTPRECHR152632", "amount": "8300.00"}') die("ERROR!!!");

    даст ясность.

    • Так дело же не в этом. Вопрос в том почему внутри переменной лежит строка в одинарных кавычках? Точнее выполняя приведенный код я получаю хэш такой же как если бы строка была в одинарных кавычках.
    • kedavr13, внутри переменной текст лежит без окружающих кавычек и апострофов.
      Или вы считаете, что по правилам PHP "4" <> '4' !?
    • Я все понимаю, поэтому и написал уточнение

      Точнее выполняя приведенный код я получаю хэш такой же как если бы строка была в одинарных кавычках.

      Но это неверный хэш, мне нужно чтобы получался хэш как если бы строка была в двойных кавычках.
      Строки у меня по факту нет вообще, она лежит в переменной, отсюда и вопрос как мне получить нужный хэш если строка в переменной и у меня нет на нее методов воздействия?

    • kedavr13, str_replace('"', '"', $data)

      P.S. Хотя я на пальцах объяснил, почему результат оказывается разный.
      А дальше найти выход из положения - уже проще простого, ну!

    • Попробуйте просто воспроизвести код передав вместо $args любой объект.
    • kedavr13, попробуйте сделать это самостоятельно, всё в ваших руках.
    • AUser0, Так я и сделал и получаю не тот хэш. Я же и пришел с вопросом сюда по тому что не понимаю почему. А вы если не в состоянии ответить, то и писать наверное не стоит.
    • сделайте
      &lt;?php var_dump('{"order_id": "FACTPRECHR152632", "amount": "8300.00"}');  var_dump("{"order_id": "FACTPRECHR152632", "amount": "8300.00"}");

      &lt;?php var_dump('{"order_id": "FACTPRECHR152632", "amount": "8300.00"}'); var_dump("{"order_id": "FACTPRECHR152632", "amount": "8300.00"}");

      видим разные строки разной длины? ну и соотв-но если на вход хеш-функции передать разные данные - получите разные результаты.

    • nokimaro, я уже не знаю как объяснить, у меня вместо строки переменная которая содержит результат
      $data = addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"');

      $data = addcslashes(json_encode($args, JSON_THROW_ON_ERROR), '"');

      Я все понимаю как работает экранирование и как работаю двойные или одинарные кавычки. Но у меня переменная которая содержит строку

      {"order_id": "FACTPRECHR152632", "amount": "8300.00"} //изображаю без кавычек для понимания что это значение переменной а не рукописная строка

      {"order_id": "FACTPRECHR152632", "amount": "8300.00"} //изображаю без кавычек для понимания что это значение переменной а не рукописная строка

      И при получении хэша из ПЕРЕМЕННОЙ я получаю такой же хэш как при хэшировании

      '{"order_id": "FACTPRECHR152632", "amount": "8300.00"}'

      '{"order_id": "FACTPRECHR152632", "amount": "8300.00"}'

      А мне нужно получить такой же хэш как при хэшировании

      "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}"

      "{"order_id": "FACTPRECHR152632", "amount": "8300.00"}"

    • kedavr13, так уберите addcslashes
      вы же сами добавляете лишние слеши перед " после того как получили строку из json_encode
    • nokimaro, а если вы не можете убрать addcslashes() то перед хешированием обработайте строку через stripcslashes()
    • kedavr13, у вас в переменной завелись барабашки слэши. Уберите их оттуда str_replace('"', '"', $data), и будьте счастливы (и внимательны в следующий раз).

    В приципе, в комментариях уже всё разжевали, но на всякий случай
    Выполняем простой код

    var_dump("{"order_id":"FACTPRECHR152632","amount":"8300.00"}"); var_dump('{"order_id":"FACTPRECHR152632","amount":"8300.00"}');

    var_dump("{"order_id":"FACTPRECHR152632","amount":"8300.00"}"); var_dump('{"order_id":"FACTPRECHR152632","amount":"8300.00"}');

    и смотрим на результат

    после этого выполняем ещё один простой код

    $json = json_encode(["order_id"=&gt;"FACTPRECHR152632", "amount"=&gt; "8300.00"]); var_dump($json); var_dump(addcslashes($json, '"'));

    $json = json_encode(["order_id"=&gt;"FACTPRECHR152632", "amount"=&gt; "8300.00"]); var_dump($json); var_dump(addcslashes($json, '"'));

    смотрим на результат
    сравниваем его с предыдущим

    И после этого идем с вопросами к тому, кто придумал написать здесь addcslashes

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Антон С. Ответ

    Хэш sha1 - это алгоритм хэширования, который принимает на вход любые данные и преобразует их в строку фиксированной длины. Вопрос о том, будет ли разный хэш sha1 для одной и той же строки, но заключенной в разные кавычки, имеет весьма интересное решение.

    При использовании алгоритма sha1 для хеширования строки, сам текст строки является важным параметром. Если мы возьмем одну и ту же строку, но заключим ее в разные кавычки (одинарные, двойные, обратные и т. д.), то результат хеширования будет одинаковым. Это происходит потому, что внутри алгоритма sha1 учитывается не только непосредственно сам текст строки, но и его кодировка, порядок символов и другие параметры.

    Таким образом, можно утверждать, что хэш sha1 для одной и той же строки, но заключенной в разные кавычки, будет одинаковым. Однако, стоит помнить, что даже небольшие изменения в тексте строки могут привести к существенным изменениям в ее хеш-значении. Поэтому важно обращать внимание на каждую деталь при работе с хешированием данных.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно