加密解密


簡介

#設定

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 的encryptStringdecryptString 方法:

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) {
    //
}
本文章首發在LearnKu.com 網站上。