本文へ移動
Laravel Tips

暗号化

鍵があれば元に戻せる「暗号化」の使い方を、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 に並べておけます。前の鍵は、コンマで区切って並べます。

ini
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
<?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 という例外(エラーを知らせるしくみ)が投げられます。

php
use Illuminate\Contracts\Encryption\DecryptException;
use Illuminate\Support\Facades\Crypt;

try {
    $decrypted = Crypt::decryptString($encryptedValue);
} catch (DecryptException $e) {
    // ...
}
メソッド 説明
encryptString 文字を暗号化する
decryptString 暗号化した文字を、元に戻す(復号する)。できなければ DecryptException が投げられる

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧