跳轉至內容

加密

簡介

Laravel 的加密服務透過 OpenSSL 提供了一個簡單、便捷的介面,用於使用 AES-256 和 AES-128 加密方式對文字進行加密和解密。Laravel 的所有加密值都使用訊息認證碼(MAC)進行簽名,以確保其底層值在加密後無法被修改或篡改。

配置

在使用 Laravel 的加密器之前,您必須在 config/app.php 配置檔案中設定 key 配置選項。此配置值由 APP_KEY 環境變數驅動。您應該使用 php artisan key:generate 命令來生成該變數的值,因為 key:generate 命令將使用 PHP 的安全隨機位元組生成器為您構建一個加密安全的應用程式金鑰。通常,APP_KEY 環境變數的值會在 Laravel 安裝過程中自動為您生成。

平滑輪轉加密金鑰

如果您更改了應用程式的加密金鑰,所有已認證的使用者會話都將被登出。這是因為每個 cookie(包括會話 cookie)都是由 Laravel 加密的。此外,任何使用之前加密金鑰加密的資料也將無法解密。

為了緩解這個問題,Laravel 允許您在應用程式的 APP_PREVIOUS_KEYS 環境變數中列出您之前的加密金鑰。該變數可以包含一個由逗號分隔的所有先前加密金鑰的列表。

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

當您設定此環境變數時,Laravel 在加密值時將始終使用“當前”加密金鑰。然而,在解密值時,Laravel 會首先嚐試當前金鑰;如果使用當前金鑰解密失敗,Laravel 將嘗試所有之前的金鑰,直到其中一個金鑰能夠成功解密該值。

這種平滑解密的方法允許使用者在您的加密金鑰輪轉時,依然可以不間斷地繼續使用您的應用程式。

使用加密器

加密值

您可以使用 Crypt 門面提供的 encryptString 方法來加密值。所有加密值都使用 OpenSSL 和 AES-256-CBC 加密演算法進行加密。此外,所有加密值都使用訊息認證碼(MAC)進行簽名。整合訊息認證碼將防止解密任何被惡意使用者篡改過的值。

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

解密值

您可以使用 Crypt 門面提供的 decryptString 方法來解密值。如果值無法正確解密(例如訊息認證碼無效時),將會丟擲 Illuminate\Contracts\Encryption\DecryptException 異常。

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