Хорошо, поэтому я тестирую Cakephp 3.0 alpha2, передавая свое приложение (2.5) на 3.x. Мое текущее приложение настроено таким образом, что при сбросе пароля вы не можете изменить его на любой из предыдущих шести паролей (хранящихся в таблице паролей, которая соединяет его с user_id) для целей безопасности. Когда я смотрю на изменения в Cake 3.0, я заметил, что если вы создадите новый объект, который хэширует пароль по-разному, даже если это тот же пароль. Что было бы хорошим способом сравнить новый пароль со старыми? Хотел бы я использовать хэшер паролей, встроенный в функцию под названием check?
CakePHP 3 использует bcrypt. Вкратце: bcrypt использует другую соль для каждого пароля и сохраняет соль как часть хэша паролей. Вот почему, как вы обнаружили, bcrypt генерирует другой хэш каждый раз, когда зашифровывается один и тот же пароль обычного текста.
Однако, если он будет использоваться как система проверки подлинности, вы должны иметь возможность проверить, подходит ли пароль для текстового пароля для данной хешированной версии этого пароля, даже если нет ни одной «правильной» хешированной версии , правильно? Правильно.
Вы делаете это с помощью метода password_verify
– http://au2.php.net/password_verify
Таким образом, вместо того, чтобы хэшировать версию с открытым текстом и видеть, соответствует ли хешированная версия нового пароля хешированным версиям каждой из последних 6 версий, вы должны вызывать password_verify
в текстовом пароле 6 раз – один раз для каждого из предыдущие хэшированные пароли, чтобы увидеть, есть ли какие-либо совпадения.
Здесь есть хорошее объяснение bcrypt в php: как вы используете bcrypt для хеширования паролей в PHP? Я бы рекомендовал прочитать это – как только вы поймете, как bcrypt обрабатывает пароли, ваша проблема не должна быть слишком сложной для решения.