Laravelで自動的に暗号化してDB保存、復号化して取得する方法

以前、Laravelでトレイトを使ってuser_idの自動登録や常に検索条件に含ませる方法を紹介しました。
今回はそれの応用で、DB登録時に常に暗号化して、表示する際は必ず復号化する方法をご紹介します。
特に個人情報やパスワードなどの重要なデータを取り扱う場合には非常に有効で、セキュリティの向上にも繋がりますので、覚えていて損はないかと思います。
自動で暗号化&復号化
今回の目的は、対象のフィールドを指定するだけで、制作者が特に意識せずに自動で暗号化・復号化できるようにしたいと思います。
使用するのは、新規で作成するトレイトと既存のモデルのみです。
トレイトを作成する
DB登録前にモデルをセットする際に暗号化し、取得する際に復号化するため、getAttribute
とsetAttribute
を上書きします。
app¥Encryptable.php
<?php
namespace App;
use Crypt;
trait Encryptable
{
public function getAttribute($key)
{
$value = parent::getAttribute($key);
if (in_array($key, $this->encryptable)) {
$value = Crypt::decrypt($value);
return $value;
}
return $value;
}
public function setAttribute($key, $value)
{
if (in_array($key, $this->encryptable)) {
$value = Crypt::encrypt($value);
}
return parent::setAttribute($key, $value);
}
}
モデル内でフィールドを指定
使い方はとっても簡単です。
使用するモデルに先ほど作成したトレイトをuseして、$encryptableに配列でフィールド名を書くだけです。
例)app¥Profile.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\Encryptable;
class Profile extends Model
{
use Encryptable;
…
/**
* Attributes that should be encryptable.
*
* @var array
*/
public $encryptable = [
'tel',
'birth',
'address',
];
}
これで完成です。
一つだけ使用上の注意点として、暗号化されれば保存する文字列が長くなりますので、テーブルを作成する際には格納するフィールドの型に気をつけてください。
コメント
コメントを投稿