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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1088閲覧

CakePHP3のAuthComponentのusernameキー値を暗号化して認証したい。

nishina_1023

総合スコア3

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/10/26 01:27

前提・実現したいこと

CakePHP3.8でAuthComponentで認証機能を付けようとしています。その際、passwordキーはdefaultのpassordHasherを使用し、usernameキーはSecurity::encryptで暗号化した物を使用したいと考えています。

発生している問題・エラーメッセージ

実装方法が分かりません。
以下URLの方法を参考にしましたが、実装出来なかったということもあり、解決できませんでした。
CakePHP3のAuthComponentのusernameキー値を暗号化していると認証に失敗してしまいます。(平文だとうまくいきます)
https://teratail.com/questions/130171

該当のソースコード

AppController.php

public function initialize() { parent::initialize(); $this->loadComponent('RequestHandler', [ 'enableBeforeRedirect' => false, ]); $this->loadComponent('Flash'); $this->loadComponent('Auth', [ 'loginAction' => [ 'controller' => 'Login', 'action' => 'login' ], 'loginRedirect' => [ 'controller' => 'Top', 'action' => 'index' ], 'logoutRedirect' => [ 'controller' => 'Login', 'action' => 'login' ], 'authenticate' => [ 'Form' => [ 'userModel' => 'Users', 'fields' => [ 'username' => 'login_id', 'password' => 'password' ], 'finder' => 'auth' ] ], 'prefix' => 'user', 'unauthorizedRedirect' => $this->referer(), 'storage' => ['className' => 'Session', 'key' => 'Auth.User'], 'authError' => __('セッションが切れました。もう1度ログインしてください。') ]); /* * Enable the following component for recommended CakePHP security settings. * see https://book.cakephp.org/3.0/en/controllers/components/security.html */ //$this->loadComponent('Security'); }

LoginController.php

<?php namespace App\Controller; use Cake\ORM\TableRegistry; use Cake\Auth\DefaultPasswordHasher; use \Exception; use App\Controller\AppController; use Cake\Event\Event; use Cake\Utility\Security; use Cake\Core\Configure; use Cake\Core\Configure\Engine\PhpConfig; class LoginController extends AppController { public function beforeFilter(Event $event) { parent::initialize(); $this->Auth->allow(['logout']); } public function login(){ if ($this->request->is('post')) { $user = $this->Auth->identify(); if ($user) { $this->Auth->setUser($user); return $this->redirect($this->Auth->redirectUrl()); } else{ $this->Flash->error(__('ログインIDまたは、パスワードが違います')); } } } public function logout() { $this->request->session()->destroy(); $this->Flash->success('ログアウトしました'); return $this->redirect($this->Auth->logout()); } } ?>

試したこと

CakePHP3のAuthComponentのusernameキー値を暗号化していると認証に失敗してしまいます。(平文だとうまくいきます)
https://teratail.com/questions/130171

補足情報(FW/ツールのバージョンなど)

cakephp3.7

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

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

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

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

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

nojimage

2020/10/26 12:20

username は、暗号化された状態でDBに格納されていて、POSTされる値は非暗号化状態のものでしょうか
nishina_1023

2020/10/26 14:58

はい。ご認識の通りです。
guest

回答1

0

ベストアンサー

Security::encrypt を username に適用することは推奨できません。

CakePHPの認証機構について

CakePHP標準のForm認証では、username を元にユーザーテーブルからユーザーを取得 して、そのレコードのパスワードフィールドと入力されたpasswordを比較して一致すれば、認証OKとしています。

src/Auth/BaseAuthenticate.php CakePHP 3.x

Security::encryptでの暗号化について

Security::encrypt では、入力値をCBCモードにて暗号化しています。

cakephp/OpenSsl.php at 3.9.3 · cakephp/cakephp

参考: 暗号利用モード - Wikipedia

Security::encrypt では、ランダムな初期化ベクトル(IV)を与えることにより、実行ごとに異なる結果が返るようになっています。

このため、ユーザーテーブルに投入した際にSecurity::encryptで暗号化した結果とログイン時に入力した値を暗号化したものは文字列として一致しませんので、データベースから認証したいユーザーを見つけることができません。

Security::encryptで使用する暗号化処理を置き換えて、IVを固定したりEBCモードで暗号化すれば固定の暗号化文字列を得られますが、この手法は暗号の強度が下がるため推奨できません。

そもそも、何のために暗号化が必要なのか、何を何から守りたいのか、暗号化したusernameを使用する必要があるのかといったところを検討したほうが良いと思います。
(通信内容を暗号化したいならSSLを掛ければいいですし、DB自体を暗号化する手法もあります。

投稿2020/10/27 00:09

nojimage

総合スコア957

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

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

nishina_1023

2020/10/28 04:46

ご回答ありがとうございます。 仰る通り、何のために暗号化が必要なのか明確に、それに合わせた方法を探します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問