2015-05-25 2 views
2

Использование пароля «testtest» и хэш «KFtIFW1vulG5nUH3a0Mv» со следующими результатами кода в различных хешей в зависимости от PHP версии (как показано на изображении ниже):функции Crypt вывода двух различных значений в зависимости от PHP версии

$salt = "KFtIFW1vulG5nUH3a0Mv"; 
$password = "testtest"; 

$key = '$2a$07$'; 
$key = $key.$salt."$"; 

echo crypt($password, $key); 

Выход 1 (РНР v.5.3.0 - 5.4.41, 5.5.21 - 5.5.25, 5.6.5 - 5.6.9): $2a$07$KFtIFW1vulG5nUH3a0Mv$.0imhrNa/laTsN0Ioj5m357/a8AxxF2q

Выход 2 (РНР v.5.5.0 - 5.5.20, 5.6.0 - 5.6.4): $2a$07$KFtIFW1vulG5nUH3a0Mv$e0imhrNa/laTsN0Ioj5m357/a8AxxF2q

Приведен пример m:

Это серьезная проблема, если крипт используется для хеш-паролей для входа в систему, поскольку в зависимости от версии PHP хеш будет отличаться. Кто-нибудь понимает, что это за проблема и как с этим бороться?

enter image description here

+0

определить * «в зависимости от версии PHP» * и прочитать руководство http://php.net/crypt –

+0

Взгляните на прикрепленное изображение, некоторые версии PHP выводят разные результаты, чем другие версии. Сейчас я добавлю детали. – JimmyBanks

+0

Я нахожусь на высоком уровне; очень трудно это увидеть; нужно прищуриться –

ответ

2

Это не столько вопрос, как вы думаете.

Прежде всего вы должны отметить, что ваш код не совсем корректен, BCrypt требует соли 22 символов, но вы предоставили соль 20 символов. Это означает, что завершающий «$» (который не нужен btw) будет рассматриваться как часть соли, а также первая буква вашего пароля. Однако $ не является допустимым символом для соли BCrypt.

Другое дело, что не все биты символа 22 используются, это связано с кодировкой, ircmaxell дал good explanation об этом. Таким образом, различные соли могут привести к такому же хешу, вы можете увидеть это хорошо в этом answer. Как теоретически могут измениться различные реализации, выполняемые этими последними битами символа 22. Пока функция склепа может проверять пароль с помощью обоих хэшей, нет проблем.

Поколение соли с ее подводными камнями является одной из причин, почему функции password_hash() и password_verify(), где написано, упрощают обработку паролей.

+0

Вы абсолютно правы, меняя соль на 22 символа, вы получаете стабильный результат. – JimmyBanks

+0

Примеры здесь http://php.net/crypt имеют '$' отставание соли, почему это? – JimmyBanks

+1

@JimmyBanks - примеры действительно немного вводят в заблуждение, в комментарии говорится: «Эти соли являются только примерами и не должны использоваться дословно в вашем коде. Вы должны создать отдельную, правильно отформатированную соль для каждого пароля. '. Кроме того, они используют алгоритм «2a», который в настоящее время следует заменить на «2y». Похоже, что они забыли обновить документы, возможно, потому, что в любом случае нужно использовать функцию 'password_hash()'. – martinstoeckli

 Смежные вопросы

  • Нет связанных вопросов^_^