Я разрабатываю так называемый AAC (Automatic Account Creator) для игры, это в основном сайт с функциями для создания учетных записей, игроков и еще нескольких вещей для игроков. Сервер поддерживает только SHA1 и обычный – что абсолютно небезопасно. Я не могу погрузиться в исходный код и внести изменения. Если в любом случае использовать SHA1, я был бы благодарен. Я просто прочитал о BCrypt, это здорово, но я не могу изменить исходный код в соответствии с BCrypt. Мне удалось установить SHA1 на регистрацию следующим образом:
$password = $input['password']; $password = sha1($password);
Но я просто не могу войти. я делаю это неправильно? похоже, что Laravel не позволит мне войти.
У меня есть get_register
и post_register
, также у меня есть get_login
и post_login
. Нужно ли мне что-то менять в post_login, чтобы заставить его войти или? любые подсказки?
Я использую php-сервер Laravel (php artisan serve) и phpMyAdmin на WAMP. Я думаю, что Laravel проверяет, когда вы проверяете DB с помощью метода Auth::attempt
try. Laravel выполняет некоторую форму хэширования, чтобы проверить текущий pw и зарегистрированный в одном, чтобы проверять друг друга.
Вам придется переписать модуль Hash
. Благодаря идеям Ларавела о концепциях IoC и Dependency Injection, это будет относительно легко.
Сначала создайте папку app/libraries
и добавьте ее в autoload.classmap
:
"autoload": { "classmap": [ // ... "app/libraries" ] },
Теперь пришло время создать наш класс. Создайте класс SHAHasher
, реализуя Illuminate\Hashing\HasherInterface
. Нам нужно реализовать три метода: make
, check
и needsRehash
.
Примечание. На Laravel 5 реализуйте Illuminate/Contracts/Hashing/Hasher
вместо Illuminate\Hashing\HasherInterface
.
приложение / библиотеки / SHAHasher.php
class SHAHasher implements Illuminate\Hashing\HasherInterface { /** * Hash the given value. * * @param string $value * @return array $options * @return string */ public function make($value, array $options = array()) { return hash('sha1', $value); } /** * Check the given plain value against a hash. * * @param string $value * @param string $hashedValue * @param array $options * @return bool */ public function check($value, $hashedValue, array $options = array()) { return $this->make($value) === $hashedValue; } /** * Check if the given hash has been hashed using the given options. * * @param string $hashedValue * @param array $options * @return bool */ public function needsRehash($hashedValue, array $options = array()) { return false; } }
Теперь, когда мы сделали свой класс, мы хотим, чтобы он использовался по умолчанию, Laravel. Для этого мы создадим SHAHashServiceProvider
, SHAHashServiceProvider
Illuminate\Support\ServiceProvider
и зарегистрируем его как hash
компонент:
приложение / библиотеки / SHAHashServiceProvider.php
class SHAHashServiceProvider extends Illuminate\Support\ServiceProvider { /** * Register the service provider. * * @return void */ public function register() { $this->app['hash'] = $this->app->share(function () { return new SHAHasher(); }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return array('hash'); } }
Круто, теперь все, что нам нужно сделать, это убедиться, что наше приложение загружает правильного поставщика услуг. В app/config/app.php
, под providers
, удалите следующую строку:
'Illuminate\Hashing\HashServiceProvider',
Затем добавьте следующее:
'SHAHashServiceProvider',
На самом деле существует более простое (или более простое, по крайней мере) решение для такого случая. вы можете «подделать» хэширование, используя этот метод в пользовательской модели:
public function getAuthPassword() { return Hash::make($this->password); }
И хеширование ввода с помощью собственной хэш-функции. Например, если ваши пароли в настоящее время хэшируются с помощью sha1, вы можете проверить пользователя с помощью
Auth::attempt(array('email' => $email, 'password' => sha1($password))
Это не похоже на хорошую практику кодирования, чтобы сделать это таким образом, но это, безусловно, будет проще, чем переписать хеш-модуль.