Как использовать шифрование SHA1 вместо BCrypt в Laravel 4?

Я разрабатываю так называемый 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, чтобы заставить его войти или? любые подсказки?

Я использую сервер Laravel php (php artisan serve) и phpMyAdmin на WAMP. Я думаю, что Laravel проверяет, когда вы проверяете DB с помощью метода Auth::attempt, laravel выполняет некоторую форму хэширования, чтобы проверить текущий pw и зарегистрированный в одном, чтобы проверять друг друга.

Ответ 1

Вам придется переписать модуль Hash. Благодаря идеям Laravel следующих концепций 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, расширяя 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',

Ответ 2

На самом деле существует более простое (или более простое, по крайней мере) решение для такого случая. вы можете "подделать" хеширование, используя этот метод в пользовательской модели:

public function getAuthPassword() {
    return Hash::make($this->password);
}

И хеширование ввода с помощью собственной хэш-функции. Например, если ваши пароли в настоящее время хэшируются с помощью sha1, вы можете проверить пользователя с помощью

Auth::attempt(array('email' => $email, 'password' => sha1($password))

Это не похоже на хорошую практику кодирования, чтобы сделать это таким образом, но это, безусловно, будет проще, чем переписать хеш-модуль.