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
コメント