加密解密
- ##用法
- #簡介
Laravel 的加密機制所使用的是OpenSSL 所提供的AES-256 和AES- 128 加密。強烈建議你使用 Laravel 內建的加密工具,而不是用其它的加密演算法。所有 Laravel 加密之後的結果都會使用訊息認證碼 (MAC) 簽名,使其底層值無法在加密後再次修改。
設定
在使用Laravel 的加密工具之前,你必須先設定config/app. php 設定檔中的
key 選項。你應該使用
php artisan key:generate指令來產生金鑰,這條 Artisan 指令會使用 PHP 的安全隨機位元組產生器來建立金鑰。如果這個
key 的值沒有被正確設置,則所有 Laravel 加密的值都會是不安全的。 用法
你可以使用輔助函數encrypt 來加密一個值。所有加密的值都使用 OpenSSL 的 AES-256-CBC 來加密。此外,所有加密過的值都會使用訊息認證碼 (MAC) 來簽名,以偵測加密字串是否已被竄改:
<?php namespace App\Http\Controllers; use App\User;use Illuminate\Http\Request; use App\Http\Controllers\Controller;class UserController extends Controller{ /** * 存储用户的保密信息 * * @param Request $request * @param int $id * @return Response */ public function storeSecret(Request $request, $id) { $user = User::findOrFail($id); $user->fill([ 'secret' => encrypt($request->secret) ])->save(); } }#
無序列化加密
加密過程中,加密的值 serialize
序列化後傳遞,允許加密物件和陣列。因此,接收加密值的非 PHP 用戶端需要對資料進行 unserialize
反序列化。如果想要在不序列化的情況下加密解密值,你可以使用Crypt
Facade 的encryptString
和decryptString
方法:
use Illuminate\Support\Facades\Crypt; $encrypted = Crypt::encryptString('Hello world.'); $decrypted = Crypt::decryptString($encrypted);
解密一個值
你可以使用輔助函數decrypt
來進行解密。如果該值無法正確解密,例如MAC 無效時,會拋出異常Illuminate\Contracts\Encryption\DecryptException
:
use Illuminate\Contracts\Encryption\DecryptException;try { $decrypted = decrypt($encryptedValue); } catch (DecryptException $e) { // }