Laravel

【Laravel】Modelで指定カラムを自動暗号化

Laravelを使っていて、DB上のデータを暗号化したいケースがあると思います。
私の場合は住所の暗号化や、OAuthなどもない外部サービスのアカウント情報を保持する必要がありやむなく利用したりしました。
自サービスのパスワードを保存する場合は暗号化ではなくハッシュ化を行ってください。

実装の方法はいくつかありますが代表的なものを紹介します。

Modelの$castsで設定する

最も簡単でLaravel newsで記事にもなっている内容です。
Laravel8.12から利用できるようです。それ以前の場合は自分でtraitを作ったりする必要がありました。
Modelに$castsを追加し、暗号化したい項目に対してencryptedの指定をします。
arrayやjsonなどにも対応しており下記のように指定できます。

protected $casts = [
    'secret_string' => 'encrypted',
    'secret_array' => 'encrypted:array',
    'secret_json' => 'encrypted:json',
    'secret_object' => 'encrypted:object',
    'secret_collection' => 'encrypted:collection',
];

対応するテーブルのmigrationは通常通りstringやtextで大丈夫です。

この方法の場合、LaravelのEloquentが処理しているのでそれを通さない場合は暗号化/複合のロジックを自分で記載する必要があります。
また、こちらの方法で暗号化したカラムは検索もできませんので注意しましょう。

検索したいなら...MySQL側で暗号化する

検索が必要な場合などはこちらを選択する必要があります

現状「検索したいけど暗号化したい」という状況がなく動作確認できていませんのでこちらは記事の紹介のみとさせていただきます。
こちらの記事に生SQLを書く形での対応方法が載っています。

また、Laravel-newsの記事でも紹介されていたこちらのプラグインを利用すると方法Aと似た手間で実装できる...かもしれません。

-Laravel