php artisan key:generate

Laravelをプロジェクトを始める時に叩く上のコマンドで生成される32文字のランダムな文字列。
Github からクローンした後などに、「No application encryption key has been specified.」
と.envを作っていないと怒られる。Laravelerは一回くらいは経験してると思います。

このAPP_KEYは何に使われているのか、セキュリティ関連なのは何となく分かりますが、
プロジェクト作成後に1回コマンドを打ってその後はだいたい忘れます。

LaravelでのAPP_KEYの役割

セッション、Cookie、CSRFトークン生成などLaravelデフォルトのセキュリティ機能で、
暗号化処理が行われる時に、このAPP_KEYを使っています。
例えばセッションでは、ユーザーがブラウザにリクエストなどをする前に、
このAPP_KEYを使用して暗号化してアプリ側はこのクッキーを復号化して処理を行います。このような暗号化機構を持つことで、ユーザーが勝手にクッキーの文字列を変えてなりすましなどをすることを防げます。また、Cryptファサードを利用して任意のクラスや関数に対して暗号化・複合化処理を実装する際にもこのAPP_KEYは使用されます。

本番稼働のアプリでコマンドを叩いてAPP_KEYを変えても良いのか。

もしAPP_KEYが変わったら既存のユーザーのパスワードが照合できなくなって、
ログインできなくなってしまうのでは?と不安に思いましたが、杞憂のようで、叩いてしまってOKです。
Laravelでのユーザー登録時のパスワード保存はハッシュ化(元に戻せない)で処理されており、
APP_KEYが使われている暗号化(元に戻せる、AES-256方式)とは別のBcryptやArgon2という方式が取られています。
ただ、上記の通りセッションには利用されているので、もしログインしているユーザーがいる時にAPP_KEYが変わったら、強制ログアウトされて、きっとびっくりすることでしょう。

Cryptファサード(暗号化)の仕方

以下は簡単な例ですが、APP_KEYを暗号化のキーとして使用するCryptファサードをLaravelでは利用することもできます。

use Illuminate\Support\Facades\Crypt;
$word = "こんにちは"
$encrypted_word = Crypt::encryptString($word);
echo($encrypted);
 // ”こんにちは”が暗号化されて出力される。
$decrypted_word = Crypt::decryptString($encrypted_word);
echo($decrypted_word);
 // 暗号化された"こんにちは"が複合化され流ので、"こんにちは"が出力される。

結論

同じAPP_KEYを使い回さずたまにはコマンドを叩いてAPP_KEYを変えてあげても、セキリュティ目線では良いかもです。
key:generateコマンドを四半期や半年に一回程度叩いてやれば安心ですね。
(Cryptファサードなどを利用して、値をDB保存しているなど別の使い方をしている場合は除きます!)

参考

おすすめの記事