Laravelでの暗号化処理

こんにちは。今回はLaravelで文字列の暗号化を実装する方法を解説していきます。ユーザーの情報を取得する系のアプリケーションでは保存データの暗号化はほぼ必須の要件かと思います。暗号化というと構えてしまいますが、Larvelではとても簡単に実装することができます。気楽な気持ちでみていきましょう。

暗号化

LaravelではCryptファサードを使ってとても簡単に文字列を暗号化することができます。アルゴリズムはAESを使用しており、暗号化の鍵は.envのAPP_KEYを使います。鍵はartisan key:generateで作ることができ、通常はインストール時に生成します。途中でAPP_KEYの値を変更すると暗号化した文字列が復号化できなくなるので注意が必要です。

暗号化のソースコードは以下の通りです。※tinkerで実行しています。

// Cryptファサードをuseします。
>>> use Illuminate\Support\Facades\Crypt;

// encryptStringメソッドで暗号化
>>> $encrypted = Crypt::encryptString('sampletoken');

// base64形式で文字列が暗号化されます
=> "eyJpdiI6Imp4SnE4NjhFVHAvWWI4Q1lDdDYzNlE9PSIsInZhbHVlIjoiem5pY3YxL05TcUdDQWZla0FDY2NjQT09IiwibWFjIjoiNDEwMDlhYzcxNjY1ZTAwMjRmNTE1YTcyZWJkYzEwNjJiMTk5MjQwMmU2NmQyMjhkYmM3MjdhOGYxMzA4MDRkMCIsInRhZyI6IiJ9"

復号化

復号化にはCryptファサードのdecryptStringを使用します。

// decryptStringメソッドで復号化
>>> $decrypted = Crypt::decryptString($encrypted);

// 値が復号化できました
=> "sampletoken"

平文を指定したり、暗号化に使用したAPP_KEYを変更したりすると正常に複合できずにDecryptExceptionを投げます。

// helloという平文指定
>>> $decrypted = Crypt::decryptString('hello');

// エラー
Illuminate\Contracts\Encryption\DecryptException with message 'The payload is invalid.'

まとめ

Laravelで暗号化と復号化を行う方法を解説しました。ファサードが提供されているおかげでとても簡単に暗号化をすることができます。データベースに突っ込むときは暗号文の桁数が多くなるので、桁数には余裕を持たせておきましょう。

Laravel

Posted by kobainmac