2015-11-06 6 views
5

私はLaravelにレガシーアプリを移植しています。古いアプリはMD5を使ってパスワードなしでパスワードをハッシュするので、Laravel内でそれを複製する必要があります。記録のために、私たちはパスワードをsaltでbcryptに変更していますが、単純なプロセスではなく、ユーザーログインが必要です。その間、従来のハッシュでログインする必要があります。LaravelでパスワードにMD5ハッシングを使用するにはどうすればよいですか?

私はMD5にAuth::hashを変換するには、このガイドに従っている:How to use SHA1 encryption instead of BCrypt in Laravel 4?アカウント登録時に、私は私のmake方法にプレーンテキストでパスワードおよび生成されたハッシュをプリントアウト

public function make($value, array $options = array()) { 
    echo $value.'<br>'.hash('md5', $value); 
    exit; 
    return hash('md5', $value); 
} 

Iを次のようにしてください:

123456 
e10adc3949ba59abbe56e057f20f883e 

偉大な、それは私が必要です。しかし、それがデータベースに保存されると、私は完全に別のハッシュを取得します。私の推測では、Laravelはパスワードをどこか別の場所に保存していますが、どこでどのようにこれを上書きするのかわかりません。

app/libraries内部マイ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 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; 
    } 

} 

マイMD5HashServiceProvider.php

<?php 
class MD5HashServiceProvider extends Illuminate\Support\ServiceProvider { 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() { 
     $this->app['hash'] = $this->app->share(function() { 
      return new MD5Hasher(); 
     }); 

    } 

    /** 
    * Get the services provided by the provider. 
    * 
    * @return array 
    */ 
    public function provides() { 
     return array('hash'); 
    } 

} 

AuthController.phpは、次のようになります。

<?php 

namespace App\Http\Controllers\Auth; 

use Hash; 
use App\User; 
use Validator; 
use Mail; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\ThrottlesLogins; 
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; 

class AuthController extends Controller 
{ 
    /* 
    |-------------------------------------------------------------------------- 
    | Registration & Login Controller 
    |-------------------------------------------------------------------------- 
    | 
    | This controller handles the registration of new users, as well as the 
    | authentication of existing users. By default, this controller uses 
    | a simple trait to add these behaviors. Why don't you explore it? 
    | 
    */ 

    use AuthenticatesAndRegistersUsers, ThrottlesLogins; 

    //protected $redirectTo = '/account'; 

    /** 
    * Create a new authentication controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     $this->middleware('guest', ['except' => 'getLogout']); 
    } 

    /** 
    * Get a validator for an incoming registration request. 
    * 
    * @param array $data 
    * @return \Illuminate\Contracts\Validation\Validator 
    */ 
    protected function validator(array $data) 
    { 
     return Validator::make($data, [ 
      'name' => 'required|max:255', 
      'email' => 'required|email|max:255|unique:users', 
      'password' => 'required|confirmed|min:6', 
     ]); 
    } 

    /** 
    * Create a new user instance after a valid registration. 
    * 
    * @param array $data 
    * @return User 
    */ 
    protected function create(array $data) 
    { 
     $this->redirectTo = '/register/step-1'; 

     $user = User::create([ 
      'name' => $data['name'], 
      'email' => $data['email'], 
      'password' => Hash::make($data['password']), 
     ]); 

     // email the user 
     Mail::send('emails.register', ['user' => $user], function($message) use ($user) 
     { 
      $message->to($user->email, $user->name)->subject('Edexus - Welcome'); 
     }); 

     // email the admin 
     Mail::send('emails.register-admin', ['user' => $user], function($message) use ($user) 
     { 
      $message->to('[email protected]***.com', 'Edexus')->subject('Edexus - New user sign up'); 
     }); 

     return $user; 
    } 
} 
+0

SHA1が廃止されましたを追加します。 – aldrin27

+2

@ aldrin27 - 洞察力のあるコメントをいただきありがとうございます。私はSHA1を使用していません。私はプレーンなMD5を使用していますが(それはさらに悪いですが)、bcryptを移植するための移行プロセスの一部です。 – Mike

+0

パスワードは、ユーザーモデル、AuthController、および関連する特性のいずれかでハッシュすることができます。余分なハッシングがあるかどうかを確認したり、ファイルを提供して助けてください。 –

答えて

3

あなたのユーザーモデルでは、パスワードのミューテータをチェック。これは、コントローラでハッシュした後にもう一度パスワードをハッシュしています。

私は、creating()およびupdating()モデルイベントでパスワードを1回ハッシュし、それをミューテータとコントローラから削除することをお勧めします。

1

STEP1:アプリ/ライブラリフォルダを作成し、作曲家のautoload.classmapに追加

"autoload": { 
    "classmap": [ 
     // ... 
     "app/libraries" 
    ] 
}, 

ステップ2:アプリで2つのPHPファイルMD5Hasher.phpとMD5HashServiceProviderを作成/ライブラリ MD5Hasher.php

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

MD5HashServiceProvider.php

<?php 
namespace App\Libraries; 
use Illuminate\Support\ServiceProvider; 
class MD5HashServiceProvider extends ServiceProvider { 
    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() { 
//  $this->app['hash'] = $this->app->share(function() { 
//   return new MD5Hasher(); 
//  }); 
     $this->app->singleton('hash', function() { 
      return new MD5Hasher(); 
     }); 
    } 
    /** 
    * Get the services provided by the provider. 
    * 
    * @return array 
    */ 
    public function provides() { 
     return array('hash'); 
    } 

STEP3:非表示または設定/ app.phpに "を照らし\ハッシュ\ HashServiceProvider ::クラス" を削除し、 "アプリケーションの\ライブラリ\ MD5HashServiceProvider ::クラス"

関連する問題