【问题标题】:Changing Laravel 5.4 password encryption and table column names更改 Laravel 5.4 密码加密和表列名
【发布时间】:2017-07-30 23:53:16
【问题描述】:

我正在尝试将 laravel 5.4 中的身份验证集成到现有数据库中,其中用户和密码字段具有其他名称(memberidpasswordnew_enc)。通过以下更改并强制RegisterController 中的create 函数使用MD5,我设法使注册工作。注册后也可以正常登录。然而实际的登录表单返回:

这些凭据与我们的记录不符。

到目前为止,我已经更改了User.php

public function getAuthPassword()
{
    return $this->passwordnew_enc;
}

public function setPasswordAttribute($value)
{
    $this->attributes['password'] = md5($value);
}

同样在LoginController.php

public function username()
{
    return 'memberid';
}

我错过了什么吗?

我只需要将两个列名更改为适合,并将密码加密从 bcrypt 更改为 md5

【问题讨论】:

  • MD5 不是一个足够的密码散列算法。最好还是继续使用内置的 bcrypt 哈希并要求所有用户重置密码。
  • 如果您阅读了这个问题,您就会明白为什么。我很清楚。我无权访问数据库,并且有另一个系统正在与这些用户一起运行,此时无法切换。
  • setPasswordAttribute() 来自哪里?
  • @dev 您的问题中没有任何内容表明您知道这一点,也没有说明您无法更改散列算法的原因。您只声明当前密码是 MD5 散列的,这就是您提出问题的原因。由于问题中没有表明您知道 MD5 不合适,因此我写了一条评论让您知道,因为很多开发人员都不知道。
  • 似乎总是有一个原因,我们不能拥有安全性,难怪黑客正在接管,一个又一个漏洞?那么猜猜是谁创造了所有有缺陷的代码?开发商。确实有必要尽可能地反击,这不仅仅是糟糕的代码,而是将用户的安全置于危险之中的代码。如果我们希望被视为专业人士,我们就需要以专业人士的身份行事。

标签: php laravel encryption laravel-5 laravel-5.4


【解决方案1】:

好的,我知道了

app\User.php

public function setPasswordAttribute($value)
{
    $this->attributes['password'] = md5($value);
}

public function getAuthPassword()
{
    return $this->passwordnew_enc;
}

public function getAuthIdentifierName()
{
    return 'memberid';
}

app\Http\Controllers\Auth\LoginController.php

public function username()
{
    return 'memb___id';
}

config\app.php

    // Illuminate\Hashing\HashServiceProvider::class,
    App\Providers\MD5HashServiceProvider::class,

app\Providers\MD5HashServiceProvider.php

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class MD5HashServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('hash', function () {
            return new \MD5Hasher;
        });
    }
    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['hash'];
    }
}

lib\MD5Hasher\MD5Hasher.php

<?php
class MD5Hasher implements Illuminate\Contracts\Hashing\Hasher
{
    /**
     * Hash the given value.
     *
     * @param  string  $value
     * @return array   $options
     * @return string
     */
    public function make($value, array $options = array())
    {
        return md5($value); //hash('md5', $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;
    }
}

composer.json

...
"autoload": {
    "classmap": [
        ...
        "app/Lib"
    ],
 ...

【讨论】:

  • MD5 或只是散列密码的理由太少了,还不如将它们保存为纯文本。 MD5 在彩虹表中查找。见List of Rainbow Tablescrackstation.net
  • 可能MD5不太好。但是使用自定义 HashServiceProvider 的想法帮助了我。你不应该得到那个-1,所以我要删除它。
【解决方案2】:

我会自定义用户提供者php artisan make:provider CustomUserProvider:

<?php

namespace App\Providers;

use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;

class CustomUserProvider extends EloquentUserProvider {

    /**
    * Validate a user against the given credentials.
    *
    * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
    * @param  array  $credentials
    * @return bool
    */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        $plain = $credentials['password']; // will depend on the name of the input on the login form
        $hashedValue = $user->getAuthPassword();

        if ($this->hasher->needsRehash($hashedValue) && $hashedValue === md5($plain)) {
            $user->passwordnew_enc = bcrypt($plain);
            $user->save();
        }

        return $this->hasher->check($plain, $user->getAuthPassword());
    }

}

这样,如果密码使用 md5 存在,它将允许它工作一次,然后重新散列它。


您将在App\Providers\AuthServiceProvider boot() 中注册CustomUserProvider,如下所示:

$this->app['auth']->provider('custom', function ($app, array $config) {
            $model = $app['config']['auth.providers.users.model'];
            return new CustomUserProvider($app['hash'], $model);
        });

编辑您的config/auth.php

'providers' => [
        'users' => [
            'driver' => 'custom',
            'model' => App\User::class,
        ],
],

如前所述,您还需要添加以下内容...

app\Http\Controllers\Auth\LoginController.php

public function username()
{
    return 'memberid';
}

app\User.php

public function getAuthIdentifierName()
{
    return 'memberid';
}

public function getAuthIdentifier()
{
    return $this->memberid;
}

public function getAuthPassword()
{
    return $this->passwordnew_enc;
}

【讨论】:

  • 在 laravel 5.4 中,我遇到了问题,如果您使用“CustomUserProvider”的精确副本,那么它将无法正常工作,您必须实现“UserProvider”接口的所有功能。
  • @SunnyTecho:我不确定你的意思...CustomUserProvider扩展EloquentUserProvider 那么为什么你需要实现@ 的所有方法987654332@ 当EloquentUserProvider 已经这样做了?
  • 我还在 laravel 5.7 中使用这个
【解决方案3】:

upful 的代码对我有用(在 Laravel 5.4 中)

但我需要补充:

use Illuminate\Contracts\Auth\Authenticatable as UserContract;

CustomUserProvider 类中。

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2018-02-14
    • 2023-03-24
    • 2017-08-04
    • 2018-03-27
    相关资源
    最近更新 更多