こんにちは!
個人開発をしている南です!
今回はLaravelのデフォルトのHash化を変更する方法を紹介します。
基本的には、LaravelのデフォルトのHash化形式Bcryptを使用した方が良いのですが、外部連携などでどうしても変更する必要が出たりする場合があります。
なので今回の記事では実際に、Hash化方法をBcryptからSha256形式に切り替えていきます。
Hashを変更する方法
まずは、LaravelのHashを取り替えるのに必要なものを紹介します。
LaravelのHashを変更するには、下記3段階を踏んでいきます。
1.HashServiceクラスの準備
2.HashServiceクラスを登録するプロバイダーの準備
3.デフォルトのサービスプロバイダーの入れ替え
HashServiceクラスの準備
今回は、sha256方式のHashに切り替える方法を紹介します。
まずは、「app/Services/Sha256/Sha256HashService.php」という形でファイルを作ります。
空のファイルを作ったら、中身を下記のように記述しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<?php namespace App\Services\Sha256; class Sha256HashService 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('sha256', $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; } /** * Get information about the given hashed value. * * @param string $hashedValue * @return array */ public function info($hashedValue) { // TODO: Implement info() method. } } |
コードの補足
このコードは3つのパーツからできています。
makeパーツ
makeパーツは下記の部分です。
makeでは、パスワードをHash化するのに使用します。
1 2 3 4 5 6 7 8 9 10 |
/** * Hash the given value. * * @param string $value * @return array $options * @return string */ public function make($value, array $options = array()) { return hash('sha256', $value); } |
checkパーツ
checkパーツは下記の部分です。
checkパーツでは、ログインの際にHash化したパスワードを比較し、ログインさせるかどうかの判断で使用します。
1 2 3 4 5 6 7 8 9 10 11 |
/** * 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; } |
needsRehas
needsRehasパーツは下記の部分です。
needsRehasでは、パスワードのHash方式が変更されているかチェックし、変更されている場合はHash方法を変更することができます。
1 2 3 4 5 6 7 8 9 10 |
/** * 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; } |
参照URL:Laravel – How do you use Hash::needsRehash()?
info
infoパーツは下記の部分です。
infoでは、hashされた値の情報をなどが必要であれば記載しましょう。
1 2 3 4 5 6 7 8 9 10 |
/** * Get information about the given hashed value. * * @param string $hashedValue * @return array */ public function info($hashedValue) { // TODO: Implement info() method. } |
HashServiceクラスを登録するServiceプロバイダーの準備
新しくHashServiceクラスが作れたら、今度はそれをServiceプロバイダーに登録します。
Serviceプロバイダーに登録することで、Laravelで今回使用したHashを使うことができるようになります。
「app/Providers/Sha256HashServiceProvider.php」というファイルを作成し、下記のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php namespace App\Providers; use App\Services\Sha256\Sha256HashService; use Illuminate\Support\ServiceProvider; class Sha256HashServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { $this->app->bind('hash', Sha256HashService::class); } /** * Bootstrap services. * * @return void */ public function boot() { // } public function provides() { return array('hash'); } } |
コードの補足
このコードは2つのパーツからできています。
regsiterパーツ
regsiterパーツは下記の部分です。
regsiterでは、使用するServiceクラスを登録しています。
1 2 3 4 5 6 7 8 9 |
/** * Register services. * * @return void */ public function register() { $this->app->bind('hash', Sha256HashService::class); } |
providesパーツ
providesパーツは下記の部分です。
providesでは、このファイルが読み込まれた時に返すクラスを指定します。
つまり、このファイルが読み込まれると「Sha256HashService::class」が読み込まれます。
1 2 3 |
public function provides() { return array('hash'); } |
デフォルトのサービスプロバイダーの入れ替え
1.HashServiceクラスの準備
2.HashServiceクラスを登録するプロバイダーの準備
上記がそれぞれ準備ができたら、Laravelの「config/app.php」を開きましょう。
開けたら、該当箇所を下記のように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'providers' => [ /* * 省略 */ Illuminate\Filesystem\FilesystemServiceProvider::class, Illuminate\Foundation\Providers\FoundationServiceProvider::class, #既存のHashServiceProviderをコメントアウト //Illuminate\Hashing\HashServiceProvider::class, #新しく追加したものを登録。 App\Providers\Sha256HashServiceProvider::class, Illuminate\Mail\MailServiceProvider::class, /* * 省略 */ ] |
これで、登録した「Sha256HashServiceProvider」を使うことができます。
反映されない場合
変更したけど、反映されないなどがあれば下記コマンドを実行しましょう。
1 |
composer dump-autoload |
まとめ
今回は、Hash化をBcryptからSha256形式に変更する方法を紹介しました。
今回紹介した内容があなたのお役に立てれば幸いです。