У меня есть существующий веб-сайт, построенный с использованием CakePhp 1.3. На этом веб-сайте я использовал алгоритм MD5 для хэша паролей.
Теперь я хочу обновить версию CakePhp до версии 2.3.5, но я не могу использовать MD5 для хэша паролей.
Я хотел бы знать, почему я не могу использовать MD5 в CakePhp 2.x. ?
md5 не является подходящим алгоритмом хеширования для хеширования паролей, не используйте его. Есть много, много ссылок, которые объясняют, почему – в том числе руководство php :
Почему обычные функции хэширования, такие как md5 () и sha1 (), непригодны для паролей?
Алгоритмы хеширования, такие как MD5, SHA1 и SHA256, разработаны очень быстро и эффективно. Благодаря современным технологиям и компьютерному оборудованию стало тривиально «грубой силой» выхода этих алгоритмов, чтобы определить исходный вход.
Из-за того, насколько быстро современный компьютер может «отменить» эти алгоритмы хеширования, многие специалисты по безопасности настоятельно рекомендуют использовать их для хэширования паролей.
Вы можете изменить алгоритм хеширования по умолчанию, используя setHash , рекомендуемый алгоритм хеширования для паролей – это blowfish:
Security::setHash('blowfish');
Если вы действительно этого хотите, вы можете просто сменить setHash
на использование md5.
Но это не очень хорошая идея.
Не ставьте под угрозу безопасность нового / обновленного приложения, чтобы удовлетворить плохую безопасность старого. Вместо использования одного и того же хеш-алгоритма (и соли) в качестве предыдущего приложения вы можете использовать логику, такую как следующий (псевдоиш-код):
$username = $this->data['User']['username']; $plainText = $this->data['User']['password']; $user = current($this->User->findByUsername($username)); Security::setHash('blowfish'); $blowfished = Security::hash($plainText, 'blowfish', $user['password']); if ($blowfished === $user['password']) { return true; // user exists, password is correct } $oldSalt = Configure::read('configure.this'); $md5ed = Security::hash($plainText, 'md5', $oldSalt); if ($md5ed === $user['password']) { $this->User->id = $user['id']; $blowfished = Security::hash($plainText); $this->User->saveField('password', $blowfished); return true; // user exists, password now updated to blowfish } return false; // user's password does not exist.
Такая логика не сложна и предотвращает необходимость использования алгоритма «плохой хэш».
Я не рекомендую использовать этот код в любом сценарии, когда-либо. MD5 – это ужасный алгоритм хэширования для обеспечения безопасности, поскольку он слишком ресурсоемкий, чтобы препятствовать растрескиванию. Он также обнаружил уязвимости. Используйте bcrypt или SHA-512.
Для этого вы можете редактировать AppController.php
следующим образом:
<?php // AppController.php public function beforeFilter() { Security::setHash('md5'); } ?>
Однако это не рекомендуется, так как MD5 – очень плохой алгоритм хэширования паролей . Вы намного лучше добавляете функцию, позволяющую пользователям входить в систему с существующими паролями md5
, поощряя их обновлять до нового хэша и не позволяя новым пользователям устанавливать пароли MD5.
Если вместо этого вы хотите использовать защищенную функцию, например, bcrypt
, вы можете сделать следующее:
<?php // AppController.php public function beforeFilter() { Security::setHash('blowfish'); } ?>
При сравнении значений обычного текста с хэшами вы должны передать исходный хеш в качестве значения соли для сохранения параметров затрат и т. Д .:
$newHash = Security::hash($newPassword, 'blowfish', $storedPassword);