2010-07-02 2 views
2

я запускаю этот скрипт:различные контрольные суммы sha1 на разных версиях php?

define('SECRET', "vJs;ly-W\XDkD_2'-M7S2/ZRRBobxt5"); 
echo sha1(SECRET . 'zcbkeyky' . '[email protected]') . "\n"; 

Локально с PHP 5.3.2 (АОН) он дает мне: 3baa47e50394cd2dce236dcbf2f409fdb9010f2a
На удаленной машине с PHP 5.1.6 (кли) это дает: d1bcf4ea83e50593d3df19a8455a5f5cd32d63ef

Почему одинаковые вычисления отличаются?

+0

Если вы действительно хотите проверить, не так ли, проверьте его на известное значение. Например, 'sha1 ('apple')' должно быть 'd0be2dc421be4fcd0172e5afceea3970e2f3d940' – Powerlord

ответ

9

Я бы сказал, что проблема здесь:

define('SECRET', "vJs;ly-W\XDkD_2'-M7S2/ZRRBobxt5"); 
//      ^^-- escape character 

PHP manual говорит:

\x[0-9A-Fa-f]{1,2} последовательность символов, совпадающая регулярное выражение символ в шестнадцатеричной системе координат

Между PHP 5.2 и 5.3, по-видимому, это было изменено так же, как и \X[0-9A-Fa-f]{1,2} (обратите внимание на столицу X в начале). При запуске в PHP 5.3 у вас есть (неосознанно?) Возврат каретки в вашей строке.

Либо a) замените обратную косую черту другим символом, либо b) используйте одинарные кавычки при определении SECRET, и обе версии возвратят один и тот же хэш (проверены в 5.2.1 и 5.3.2).

+0

+1: Хорошая добыча. Я пропустил это, глядя на код. Однако это иллюстрирует, почему следует использовать одинарные кавычки в строковых литералах. – Powerlord

+0

@R. Bemrose: У нас было какое-то серьезное неудобство с двойными кавычками и упрямым разработчиком некоторое время назад; научил меня относиться к '' 'с предельным подозрением. Это был процесс: почему SECRET определен в двойных кавычках, а остальное - в одиночном кавычке?» Если строка заключена в двойные кавычки, PHP будет интерпретировать больше управляющих последовательностей для специальных персонажи ", есть ли у нас что-нибудь из этого? Подождите минуту, что это за обратная косая черта? – Piskvor

+0

mr eagleeye! спасибо – baloo

2

Единственное, что я могу придумать, это кодирование файлов/строк на каждом сервере?

Мой результат 3baa47e50394cd2dce236dcbf2f409fdb9010f2a (локально)

+0

Я думаю, что ваша теория о кодировании находится на месте, но это не имеет ничего общего с файлами (OP - хеширование строки, а не файла). Я бы уточнил php.ini и/или phpinfo() для получения дополнительной информации. –

+1

@ Крис: Я предполагаю, что он имел в виду кодировку исходного файла PHP. – Powerlord

+0

да, что я имел в виду – Lizard