はじめに

Laravelの暗号化サービスは、AES-256およびAES-128暗号化を使用してOpenSSL経由でテキストを暗号化および復号化するためのシンプルで便利なインターフェースを提供します。Laravelのすべての暗号化された値は、メッセージ認証コード(MAC)を使用して署名されているため、暗号化された後はその基になる値を変更したり改ざんしたりすることはできません。

設定

Laravelの暗号化機能を使用する前に、key設定オプションをconfig/app.php設定ファイルに設定する必要があります。この設定値はAPP_KEY環境変数によって駆動されます。この変数の値を生成するにはphp artisan key:generateコマンドを使用するべきです。なぜなら、key:generateコマンドはPHPの安全なランダムバイト生成器を使用して、アプリケーションのための暗号的に安全なキーを構築するからです。通常、APP_KEY環境変数の値はLaravelのインストール中に自動的に生成されます。

暗号化キーの優雅なローテーション

アプリケーションの暗号化キーを変更すると、すべての認証されたユーザーセッションはアプリケーションからログアウトされます。これは、セッションクッキーを含むすべてのクッキーがLaravelによって暗号化されているためです。さらに、以前の暗号化キーで暗号化されたデータを復号化することはもはや不可能になります。

この問題を軽減するために、LaravelはアプリケーションのAPP_PREVIOUS_KEYS環境変数に以前の暗号化キーをリストすることを許可します。この変数には、すべての以前の暗号化キーのカンマ区切りリストが含まれる場合があります:

  1. APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="
  2. APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2ax3EF2Lyq/hH6QghBGLIq5uL+Gp8/w="

この環境変数を設定すると、Laravelは常に値を暗号化する際に「現在の」暗号化キーを使用します。ただし、値を復号化する際には、Laravelはまず現在のキーを試み、復号化が失敗した場合は、以前のすべてのキーを試して、いずれかのキーが値を復号化できるまで続けます。

この優雅な復号化のアプローチにより、暗号化キーがローテーションされても、ユーザーはアプリケーションを中断することなく使用し続けることができます。

暗号化機能の使用

値の暗号化

  1. ``````php
  2. <?php
  3. namespace App\Http\Controllers;
  4. use Illuminate\Http\RedirectResponse;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Crypt;
  7. class DigitalOceanTokenController extends Controller
  8. {
  9. /**
  10. * Store a DigitalOcean API token for the user.
  11. */
  12. public function store(Request $request): RedirectResponse
  13. {
  14. $request->user()->fill([
  15. 'token' => Crypt::encryptString($request->token),
  16. ])->save();
  17. return redirect('/secrets');
  18. }
  19. }
  20. `

値の復号化

  1. ``````php
  2. use Illuminate\Contracts\Encryption\DecryptException;
  3. use Illuminate\Support\Facades\Crypt;
  4. try {
  5. $decrypted = Crypt::decryptString($encryptedValue);
  6. } catch (DecryptException $e) {
  7. // ...
  8. }
  9. `