
Contents
APP_KEYとは
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保存しているなど別の使い方をしている場合は除きます!)