【Laravel】アクセサ(Accessor)で暗号化データを復号する方法を解説

はじめに

今回はLaravelのモデル機能である「アクセサ(Accessor)」を使って、暗号化されたデータを復号して表示する方法を紹介します。
例として name 属性を扱いますが、もちろん他のカラムにも応用可能です。

その中でも今回は、「name」属性だけに絞って、暗号化された値を復号して表示する方法を初心者向けに解説します。

やりたいこと

  1. アクセサ(Accessor)の使い方を理解する
  2. 暗号化された”name”を自動で復号して表示したい
  3. 必要最低限の記述でスッキリ実装

準備するもの

ライブラリ

Laravel標準機能のみでOKです。

インポート手順

Cryptだけ以下のようにインポートします。

use Illuminate\Support\Facades\Crypt;

このライブラリの説明

CryptはLaravelで暗号化・復号を行うためのクラスです。 Crypt::encrypt($value)で暗号化、Crypt::decrypt($value)で復号できます。

ディレクトリ構成

app/
└── Models/
    └── Admin.php

コードスクリプト

コードスクリプトの概要

Adminモデルの”name”カラムには暗号化された文字列が保存されています。アクセサを使うことで、取得時に復号された状態で値を受け取れるようにします。

 

// Admin.php モデル

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Database\Eloquent\SoftDeletes;

class Admin extends Authenticatable
{
use HasFactory, Notifiable, SoftDeletes;

// name のみ復号するアクセサ
protected function decrypt($value)
{
return isset($value) ? Crypt::decrypt($value) : null;
}

public function getNameAttribute($value)
{
return $this->decrypt($value);
}
}

実行結果

たとえば以下のように取得したとき:

$admin = Admin::find(1);
echo $admin->name;

DBに暗号化された文字列が入っていても、画面には元の名前が表示されます!

コード解説

getNameAttribute() というメソッドを定義することで、$admin->nameと書いたときにこの関数が自動的に実行されます。

復号処理は Crypt::decrypt() を使って行っており、存在しない場合(nullなど)はそのままnullを返しています。

注意点

  • このようなアクセサは表示専用です。保存するときは別途 Crypt::encrypt() を使う必要があります。
  • 万が一、復号できないデータがあると例外が発生するので、try-catchで囲ってもOKです。
  • すべての属性にアクセサを付ける必要はありません。必要なものだけでOK!

まとめ

今回はLaravelのアクセサ(Accessor)を使って、暗号化されたname属性を復号して取得する方法を紹介しました。

アクセサは「読み取り時に加工したい値」があるときに非常に便利な機能です。 特にセキュリティが関わるデータの取り扱いに役立つので、ぜひプロジェクトで活用してみてください!

コメント

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