m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

cakephp3パスワードハッシュ

実装

今回はハッシュだけ試すのでshellで実験

app/App/Console/Command/Sample1Shell.php
<?php
namespace App\Console\Command;

use Cake\Console\Shell;
use Cake\Auth\SimplePasswordHasher;
use Cake\Auth\WeakPasswordHasher;
use Cake\Auth\FallbackPasswordHasher;
use App\Auth\DumbPasswordHasher;

/**
 * Sample1 shell command.
 */
class Sample1Shell extends Shell {

/**
 * main() method.
 *
 * @return bool|int Success or error code.
 */
	public function main() {

        $password = "password";
        echo "Text\n";
        echo $password . "\n";
        echo "\n";

        // デフォルトのパスワードハッシュ
        echo "SimplePasswordHasher\n";
        $hasher = new SimplePasswordHasher();
        echo $hasher->hash($password) . "\n";
        echo $hasher->hash($password) . "\n";
        echo "\n";

        // 弱めのパスワードハッシュ
        echo "WeakPasswordHasher\n";
        $hasher = new WeakPasswordHasher();
        echo $hasher->hash($password) . "\n";
        echo $hasher->hash($password) . "\n";
        echo "\n";

        // 複数のハッシュパターンを内蔵
        echo "FallbackPasswordHasher\n";
        $hasher = new FallbackPasswordHasher([
            "hashers" => ['Simple', 'Weak']
        ]);
        echo $hasher->hash($password) . "\n";
        echo $hasher->hash($password) . "\n";
        echo "\n";

        // 独自ハッシュ
        echo "DumbPasswordHasher\n";
        $hasher = new DumbPasswordHasher();
        echo $hasher->hash($password) . "\n";
        echo $hasher->hash($password) . "\n";
        echo "\n";

	}
}
結果
[vagrant@localhost 05_shell]$ sh app/App/Console/cake sample1

Welcome to CakePHP v3.0.0-dev3 Console
---------------------------------------------------------------
App : App
Path: /vagrant/projects/cakephp3-sample/05_shell/app/App/
---------------------------------------------------------------
Text
password

SimplePasswordHasher
$2y$10$vJ9JPTBVDyeDcCaKpCfR0eWDPS4e9/nfC/nKNKnqydLTFgV4T6lKi
$2y$10$Q/hmRu3MtT1CSpJNgmYfke4lB.Ze76osfDNXQNwNBZNlHU5GwY.JO

WeakPasswordHasher
741f5ad6abd52a56054d8519dec64efc24fc849c
741f5ad6abd52a56054d8519dec64efc24fc849c

FallbackPasswordHasher
$2y$10$zz4LjC5KWDE2Ou5xTQYd9OITvkLI4.AAnQGIInD6Lb1XxveZFjDgW
$2y$10$rOpBUy5vJdFyxQ90WambL.15OsEuU4qtgM5ZkxVNTPCoewssWuKpO

DumbPasswordHasher
5f4dcc3b5aa765d61d8327deb882cf99
5f4dcc3b5aa765d61d8327deb882cf99

[vagrant@localhost 05_shell]$





既存ハッシュクラス

SimplePasswordHasher

password_hash、password_verifyにて暗号化・チェックを行っているようです。
暗号化の度に値が変更されていることからなんらかのパターンで照合を行うような感じ

WeakPasswordHasher

今までの暗号化方式かと、Security?を使用した暗号化を使用している

FallbackPasswordHasher

予めコンストラクタ生成時にhasherを設定しておくことで照合パターンを複数用意することができるよう。
暗号可は1つに対し、照合を3つくらい用意できるような感じ

独自ハッシュ関数について

  • app\App\Auth配下に作成
  • \Cake\Auth\AbstractPasswordHasherを継承すること

上記により、他のHasherと同じように制御が可能

app/App/Auth/DumbPasswordHasher.php
<?php
/**
 * Created by PhpStorm.
 * User: ?????
 * Date: 2014/06/15
 * Time: 8:50
 */

namespace App\Auth;
use \Cake\Auth\AbstractPasswordHasher;

class DumbPasswordHasher extends AbstractPasswordHasher{

    public function hash($password){
        return md5($password);
    }

    public function check($password, $hashedPassword){
        return (md5($password) == $hashedPassword);
    }

} 

hashで暗号化、checkで同一チェックを行っているよう
今回はドキュメントと同じくmd5のしょぼい暗号化にしています

まとめ

現在、使用できる暗号化は2パターンですが、独自の暗号化方法も簡単に組み込めるようです。
自分専門の暗号化を組み込みたい場合は必須かと、面倒な場合はWeakあたり、version5.5以降の場合はSimpleを使用できるのかな?