質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

7123閲覧

Laravel5.5 ログイン認証 パスワードの保存をハッシュ化から暗号化に変更

vulcan11

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/05/22 16:28

編集2019/05/22 16:42

前提・実現したいこと

環境:
Laravel 5.5
PHP 7.2.17

Laravel 5.5 の標準のログイン認証の際のパスワードのを復元できるようにするために保存方法をハッシュ化から暗号化で行いたい。
また暗号化したパスワードで認証を行いたい。

試したこと

Laravel 5.5 の標準のユーザー登録をカスタマイズしてハッシュ化から暗号化に変更してパスワードを保存しました。

\app\Http\Controllers\Auth\RegisterController.php

PHP

1protected function create(array $data) 2{ 3 return User::create([ 4 'name' => $data['name'], 5 'email' => $data['email'], 6 // ハッシュ化から暗号化に変更 7 // 'password' => bcrypt($data['password']), 8 'password' => encrypt($data['password']), 9 ]); 10}

しかし、ログインするためにはパスワードの照合を行わなければなりませんが、
パスワードの照合を行っているのが

\vendor\laravel\framework\src\Illuminate\Auth\EloquentUserProvider.php

PHP

1public function validateCredentials(UserContract $user, array $credentials) 2{ 3 $plain = $credentials['password']; 4 5 return $this->hasher->check($plain, $user->getAuthPassword()); 6}

のため、/vendor 配下のファイルで行われています。

PHP

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

PHP

1return ($plain === decrypt($user->getAuthPassword()));

に編集すればログインできるようになったのですが、/vendor 配下のファイルを編集するのではなく、暗号化したパスワードで照合を行うようにカスタマイズすることは可能でしょうか?
また、可能ならどのようにカスタマイズすればよいでしょうか?

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/05/22 22:08

なんのために「パスワードを復元できる」必要がありますか?
m.ts10806

2019/05/23 01:31

パスワードを復元できることで得られる恩恵は何がありますか? むしろセキュリティ上のリスクしかないように思いますが。
mikkame

2019/05/23 05:43

> なんのために「パスワードを復元できる」必要がありますか? > パスワードを復元できることで得られる恩恵は何がありますか? > むしろセキュリティ上のリスクしかないように思いますが。 顧客要望でこういうのたまにある。しょうがないね・・・
guest

回答2

0

aro10さんが言っているのが適切な方法だが
適当にサボりたい場合は

passwordカラムと、encrypted_passwordカラムを作り

return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), 'encrypted_password' => encrypt($data['password']), ]);

としてしまう。

パスワード再発行の時も似たような処理が入るので何箇所かやらないといけないですね

投稿2019/05/23 05:43

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aro10

2019/05/23 09:27

何かの際に復元したい意図であれば、ログインで使うパスワードは今後の互換も考えて通常のハッシュを使って、復元できるパスワードは、Eloquentのモデルイベントで自動的に、可逆式の暗号で別のカラムに保存しておく方が良さそうですね????
vulcan11

2019/05/23 11:53

発想の転換というかこういう考え方もあるんですね。 今回はaro10さんのやり方で出来たのですが、似たような処理で書き換えが出来ないときには使ってみようと思います。 ありがとうございました。
mikkame

2019/05/23 13:51

暗号化するだけまだマシ。 従業員のパスワードを把握したいとかいう要件が飛んできたことがある。
m.ts10806

2019/05/23 13:53

>従業員のパスワードを把握したいとかいう要件 「管理者もパスワード変更できるように(基本的にユーザーがパスワード忘れたときの初期化のために利用)」ならまだわかるけど・・・。
mikkame

2019/05/23 15:15

@mts10806 そうなんですよね。ワンマン社長みたいな感じだったのでそういう社風なんですかね・・・ (なお、現行のパスワードは入社日みたいな感じでした) 他にも アカウントのパスワードが複数人に共有されているシステム(1企業に1アカウントのB2Bシステム) とかだと、安易にパスワード再発行させると、共有している人が困るから、できれば再発行じゃなくてパスワードを再度送ってほしい、みたいな運用も見かけました(そのために、パスワードは復元できるようにして、みたいな感じで)
mikkame

2019/05/23 15:17

ちなみにアカウントパスワードを共有するのはアカンと思うんですけど 楽天市場もそういう運用なんですよねー・・・ヤフーショッピングはサブアカウント作れるんですけど。
m.ts10806

2019/05/23 20:48

パスワードの意味… Pマーク的にもISMS的にもアウトですね…
mikkame

2019/05/24 03:38 編集

PマークもISMSも法的義務はないし取ってるほうが少数派だから・・・ 私も情報セキュリティスペシャリスト(故)の端くれなので昔は気張っていましたが 現場に揉まれてステークホルだのいいなりです。 所詮プログラマ、営業や先方には勝てないのです
guest

0

ベストアンサー

vendorを編集すると、composerでライブラリを更新した際に、上書きされてしまいます。

config/auth.phpのprovidersの添え字箇所に、User Providersの定義があるかと思いますが、
この部分のdriverを、独自にカスタマイズしたものを割り当てる事でvendorを直接編集せずに実現可能です。

以下の情報を起点として、調査してみてください。
Laravel 5.5 認証 カスタムユーザープロバイダの追加

投稿2019/05/22 21:12

編集2019/05/22 21:13
aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vulcan11

2019/05/23 11:49

ちゃんと置き換える仕組みが用意されているのですね。 Illuminate\Auth\EloquentUserProviderを継承して、validateCredentialsメソッドをオーバーライド。 あとはリンクにあるカスタムユーザープロバイダの追加を参考にしてハッシュ化の代わりに暗号化したパスワードの照合が出来るようになりました。 やってみたら単純でしたが知らないと難しいですね。 大変参考になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問