暗号化
鍵があれば元に戻せる「暗号化」の使い方を、APP_KEY の設定、鍵の入れ替え、Crypt の encryptString と decryptString まで説明します。
暗号化とは、文字を、鍵がないと読めない形に変えることです。鍵を持つ人だけが、元の文字に戻せます。パスワードのように、元に戻す必要がないもののハッシュ(元に戻せない形)とは、ここがちがいます。Laravel の暗号化の機能は、OpenSSL(暗号を扱う、広く使われているソフト)を使います。AES-256 と AES-128(どちらも暗号の方式)で、文字を暗号化・復号(元に戻すこと)する、簡単なしくみです。暗号化した値には、すべて MAC(メッセージ認証コード。値が書き換えられていないかを確かめる印)が付くので、暗号化したあとに、中身を変えたり、いじったりはできません。
設定#
暗号化を使う前に、config/app.php の key オプションを設定する必要があります。この値は、環境変数(環境ごとに変える設定値)の APP_KEY で決まります。APP_KEY の値は、php artisan key:generate のコマンドで作ってください。このコマンドは、PHP の安全な乱数の生成を使って、暗号として安全な鍵を作ります。ふつう、APP_KEY の値は、Laravel をインストールするときに自動で作られます。
鍵を切り替える#
アプリの暗号化の鍵を変えると、ログインしているすべてのユーザーが、ログアウトされます。セッションの Cookie を含む、すべての Cookie を、Laravel が暗号化しているからです。さらに、前の鍵で暗号化したデータを、復号できなくなります。
この問題をやわらげるために、前の鍵を、環境変数 APP_PREVIOUS_KEYS に並べておけます。前の鍵は、コンマで区切って並べます。
APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="
APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2ax3EF2Lyq/hH6QghBGLIq5uL+Gp8/w="
この変数を設定すると、Laravel は、値を暗号化するときは、いつも「いまの」鍵を使います。復号するときは、まずいまの鍵を試し、復号できなければ、復号できる鍵が見つかるまで、前の鍵を順に試します。
このやり方なら、鍵を入れ替えても、ユーザーは、とぎれることなく、アプリを使い続けられます。
暗号化の使い方#
値を暗号化する#
Crypt ファサード(Crypt::encryptString() のように、クラス名と :: で機能を呼べる窓口)の encryptString で、値を暗号化できます。暗号化した値は、すべて OpenSSL と AES-256-CBC の方式で暗号化されます。さらに、すべての値に MAC が付きます。MAC のおかげで、悪い人が書き換えた値は、復号できません。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;
class DigitalOceanTokenController extends Controller
{
/**
* ユーザーの DigitalOcean の API トークンを保存する
*/
public function store(Request $request): RedirectResponse
{
$request->user()->fill([
'token' => Crypt::encryptString($request->token),
])->save();
return redirect('/secrets');
}
}
値を復号する#
Crypt ファサードの decryptString で、値を復号できます。MAC が正しくないときなど、値を正しく復号できなければ、Illuminate\Contracts\Encryption\DecryptException という例外(エラーを知らせるしくみ)が投げられます。
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;
try {
$decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
// ...
}
| メソッド | 説明 |
|---|---|
encryptString |
文字を暗号化する |
decryptString |
暗号化した文字を、元に戻す(復号する)。できなければ DecryptException が投げられる |
関連するページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。