加密
簡介
Laravel 的加密服務提供一個簡單且方便的介面,可讓我們通過 OpenSSL 使用 AES-256 或 AES-128 加密方法來加解密文字。Laravel 中所有的加密資訊都使用訊息驗證碼 (MAC, Message Authentication Code) 簽名,因此一旦經過加密,底層的值將無法被修改或竄改。
設定
在開始使用 Laravel 的 Encrypter 前,我們必須先在 config/app.php
設定檔中設定 key
。這個設定以 APP_KEY
環境變數提供,我們可以使用 php artisan key:generate
指令來產生這個變數值。key:generate
指令會使用 PHP 的安全隨機位元組產生器來為你的專案建立密碼學上安全的密鑰。一般來說,APP_KEY
環境變數會在 Laravel 的安裝過程中就為你產生好了。
使用加密程式
加密
可以使用 Crypt
Facade 提供的 encryptString
方法來加密。所有加密的值都使用 OpenSSL 與 AES-256-CBC Cipher 來加密。此外,所有加密的值都使用訊息驗證碼 (MAC, Message Authentiation Code) 簽名。整個在內的 MAC 可以防止我們去解謎任何由惡意使用者修改過的值:
1<?php23namespace App\Http\Controllers;45use App\Http\Controllers\Controller;6use App\Models\User;7use Illuminate\Http\Request;8use Illuminate\Http\Response;9use Illuminate\Support\Facades\Crypt;1011class DigitalOceanTokenController extends Controller12{13 /**14 * Store a DigitalOcean API token for the user.15 */16 public function storeSecret(Request $request): Response17 {18 $request->user()->fill([19 'token' => Crypt::encryptString($request->token),20 ])->save();2122 return response()->noContent();23 }24}
1<?php23namespace App\Http\Controllers;45use App\Http\Controllers\Controller;6use App\Models\User;7use Illuminate\Http\Request;8use Illuminate\Http\Response;9use Illuminate\Support\Facades\Crypt;1011class DigitalOceanTokenController extends Controller12{13 /**14 * Store a DigitalOcean API token for the user.15 */16 public function storeSecret(Request $request): Response17 {18 $request->user()->fill([19 'token' => Crypt::encryptString($request->token),20 ])->save();2122 return response()->noContent();23 }24}
解密
可以使用 Crypt
Facade 提供的 decryptString
方法來解密值。若該值無法被正確解密,如 MAC 無效等情況,則會擲回 Illuminate\Contracts\Encryption\DecryptException
:
1use Illuminate\Contracts\Encryption\DecryptException;2use Illuminate\Support\Facades\Crypt;34try {5 $decrypted = Crypt::decryptString($encryptedValue);6} catch (DecryptException $e) {7 // ...8}
1use Illuminate\Contracts\Encryption\DecryptException;2use Illuminate\Support\Facades\Crypt;34try {5 $decrypted = Crypt::decryptString($encryptedValue);6} catch (DecryptException $e) {7 // ...8}