Хэш sha1 разный в зависимости от того в каких кавычках строка?
Есть вот такой кусок кода
$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, Так я и сделал и получаю не тот хэш. Я же и пришел с вопросом сюда по тому что не понимаю почему. А вы если не в состоянии ответить, то и писать наверное не стоит.
- сделайте
<?php var_dump('{"order_id": "FACTPRECHR152632", "amount": "8300.00"}'); var_dump("{"order_id": "FACTPRECHR152632", "amount": "8300.00"}");
<?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"=>"FACTPRECHR152632", "amount"=> "8300.00"]); var_dump($json); var_dump(addcslashes($json, '"')); |
$json = json_encode(["order_id"=>"FACTPRECHR152632", "amount"=> "8300.00"]); var_dump($json); var_dump(addcslashes($json, '"'));
смотрим на результат
сравниваем его с предыдущим
И после этого идем с вопросами к тому, кто придумал написать здесь addcslashes
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Хэш sha1 - это алгоритм хэширования, который принимает на вход любые данные и преобразует их в строку фиксированной длины. Вопрос о том, будет ли разный хэш sha1 для одной и той же строки, но заключенной в разные кавычки, имеет весьма интересное решение.
При использовании алгоритма sha1 для хеширования строки, сам текст строки является важным параметром. Если мы возьмем одну и ту же строку, но заключим ее в разные кавычки (одинарные, двойные, обратные и т. д.), то результат хеширования будет одинаковым. Это происходит потому, что внутри алгоритма sha1 учитывается не только непосредственно сам текст строки, но и его кодировка, порядок символов и другие параметры.
Таким образом, можно утверждать, что хэш sha1 для одной и той же строки, но заключенной в разные кавычки, будет одинаковым. Однако, стоит помнить, что даже небольшие изменения в тексте строки могут привести к существенным изменениям в ее хеш-значении. Поэтому важно обращать внимание на каждую деталь при работе с хешированием данных.