У меня есть следующий фрагмент кода:
// bcrypt hash of 'password' $hash = '$2y$10$4u0cQ.WEnwHDo.C5Nl1vm.shKA0beQ32wqzphSfzklAq9OcDM2nLu'; if(password_verify('password', $hash)) { print_r('woohoo!'); } else { print_r('fubar'); }
На одном сервере он работает нормально (woohoo!), А на другом он не работает. Я просто поместил его на codepad.org, и он тоже терпит неудачу.
Проблема заключается в том, что хэш, вычисленный с помощью crypt
имеет длину 13 вместо требуемых 60.
Я использую библиотеку password_compat ircmaxel для github для реализации только функции password_verify
для PHP 5.5.
Кажется, что вы запускаете скрипт на PHP-версии меньше 5.3.7, и поэтому алгоритм «2y» пока не известен.
Если возможно, я бы рассмотрел возможность обновления PHP на этом сервере, параметр «2y» решает проблему со строками ввода unicode.
Если это не вариант, вы можете заменить алгоритм в пакете совместимости. Где-то около строки 49 вы найдете …
$hash_format = sprintf("$2y$%02d$", $cost);
… изменить его на прежнюю константу BCrypt '2a' …
$hash_format = sprintf("$2a$%02d$", $cost);
… это, конечно, не оптимально, но это лучшее, что вы можете сделать в более ранних версиях.
Новый сгенерированный хеш-пароль теперь будет начинаться с '$2a$10$...'
и проверка с помощью этого хэш-значения должна работать на каждой системе.