DefaultPasswordHasherの仕組みと使い方【CakePHP5】

CakePHPでは安全なパスワード生成のために、DefaultPasswordHasherを利用することが推奨されています。

公式のCMSチュートリアルのログインの実装でもDefaultPasswordHasherを用いたパスワードの不可逆圧縮(ハッシュ化)が利用されています。

今回の記事ではこのDefaultPasswordHasherの仕組みと使い方について解説します。

仕組み

DefaultPasswordHasherではパスワードの安全性を担保するために、パスワードを「不可逆圧縮」しています。

不可逆圧縮(ハッシュ化)とは、以下のような仕様で文字列を圧縮するための仕組みです。

・「パスワード文字列」から「変換された文字列」を生成することができる

・「変換された文字列」から「パスワード文字列」を推測することは不可

DBにパスワードとして保存するのは、「変換された文字列」の方です。

つまり、仮にDBのデータを見ても、元のパスワードを推測することはできません。

DBに不正にアクセスされても、直接パスワードが流出することは防ぐことができます。

使い方

インストールと読み込み

インストール

CakePHP5では以下のようにComposerでインストールします。

composer require "cakephp/authentication:^3.0"

※CakePHP4では下記

composer require "cakephp/authentication:^2.0"

読み込み

<?php
namespace App\Controller;

//Cakephp5の場合
use Authentication\PasswordHasher\DefaultPasswordHasher;
//Cakephp4の場合
//use Cake\Auth\DefaultPasswordHasher

class SamplesController extends AppController
{
       passwordAction (){
           $hasher = new DefaultPasswordHasher();
            //action内で後述の関数を利用可能になる。
       }
}

関数一覧

①ハッシュ化:hash()

以下のように文字列をハッシュ化します。

$hasher = new DefaultPasswordHasher();
$password = "パスワード文字列"
$hashedPassword = $hasher->hash($password);

$hashedPasswordをパスワードとして保存すれば、②check()関数と組み合わせて安全に運用できます。

②一致チェック:check()

以下のように行います。

$hasher = new DefaultPasswordHasher();
$savedPassword = "保存されたパスワード(ハッシュ化済)";
$inputPassword = "フォームで入力されたパスワード(平文)";

if ($hasher->check($inputPassword, $savedPassword)) {
    //パスワードが一致した場合の処理
}else{
    //パスワードが不一致だった際の処理
}

③ハッシュ化の仕組みが古いかチェック:needsRehash()

以下を設定すると、最新の仕組みで常にハッシュ化を行えます。

$hasher = new DefaultPasswordHasher();
$savedPassword = "保存されたパスワード(ハッシュ化済)";
$inputPassword = "フォームで入力されたパスワード(平文)";

if ($hasher->check($inputPassword, $savedPassword)) {
        // パスワードの再ハッシュが必要かを確認
        if ($hasher->needsRehash($savedPassword)) {
            $newHashedPassword = $hasher->hash($inputPassword);
            // newHashedPasswordを保存すると、最新のハッシュ化が施される
            //フォームに入力する平文のパスワードは以前と同じものを継続利用することができる。
       }
 }

利用例(過去記事)

ログインの実装

設定したパスワードをハッシュ化するために、先述の①hash()関数が利用されています。

パスワード変更の実装

現パスワードの一致チェックに②check()が、新規パスワードの生成に①hash()が使われています。

参考

CakePHP4公式:CMS Tutorial

コメント

タイトルとURLをコピーしました