加密
簡介
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 的安裝過程中就為你產生好了。
Using the Encrypter
Encrypting a Value
可以使用 Crypt
Facade 提供的 encryptString
方法來加密。所有加密的值都使用 OpenSSL 與 AES-256-CBC Cipher 來加密。此外,所有加密的值都使用訊息驗證碼 (MAC, Message Authentiation Code) 簽名。整個在內的 MAC 可以防止我們去解謎任何由惡意使用者修改過的值:
1<?php23namespace App\Http\Controllers;45use Illuminate\Http\RedirectResponse;6use Illuminate\Http\Request;7use Illuminate\Support\Facades\Crypt;89class DigitalOceanTokenController extends Controller10{11 /**12 * Store a DigitalOcean API token for the user.13 */14 public function store(Request $request): RedirectResponse15 {16 $request->user()->fill([17 'token' => Crypt::encryptString($request->token),18 ])->save();1920 return redirect('/secrets');21 }22}
1<?php23namespace App\Http\Controllers;45use Illuminate\Http\RedirectResponse;6use Illuminate\Http\Request;7use Illuminate\Support\Facades\Crypt;89class DigitalOceanTokenController extends Controller10{11 /**12 * Store a DigitalOcean API token for the user.13 */14 public function store(Request $request): RedirectResponse15 {16 $request->user()->fill([17 'token' => Crypt::encryptString($request->token),18 ])->save();1920 return redirect('/secrets');21 }22}
Decrypting a Value
可以使用 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}