Laravel 對 ID 進行對稱加密的 Composer 包 hashid

jenkincei發表於2017-09-19

GitHub:
jiaxincui/hashid

介紹

一個對Laravel應用模型ID進行對稱加密的輔助函式。

依賴於hashids/hashids

只適用於正整數加密。

安裝

$ composer require jiaxincui/hashid

配置

  1. 複製config/hashid.php檔案到Laravel專案的config資料夾。
  2. 在.env檔案新增配置項HASH_ID_ALPHABET=your-key
    • 為了Hash成更安全的字串,請手動重新生成HASH_ID_ALPHABET,為0-9a-zA-Z共62個字元隨機排序,字元不可重複,長度為16-62,可使用以下方法生成
      echo str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

      簡單使用

      包含兩個輔助方法id_encode()id_decode()
      在Laravel專案的任何地方均可使用這兩個函式對ID進行加密或解密。

例子


echo id_encode(4568); //輸出:N5lkv0

echo id_decode('N5lkvO'); //輸出:4568

//不可對float型別數字加密,不可對負數加密,給定任何非正整數引數都會丟擲錯誤,如:
echo id_encode(2.36); //非正整數,丟擲錯誤
echo id_encode(-23); //非正整數,丟擲錯誤

//解密時任何無效字串引數或校驗錯誤都會丟擲錯誤, 如:
echo id_decode('m_Dl9'); //包含無效字元,丟擲錯誤
echo id_decode('nlK8GhRW'); //校驗錯誤,丟擲錯誤

hashids/hashids不同的是hashids提供多個數字或包含多個數字的陣列加密成一個字串,
解密時以陣列形式返回,這在實際應用中並不常見,反而給使用帶來一定麻煩,
而此包對此進行了一些處理,不提供多個數字或多個數字陣列的加密,解密時直接返回解密後的數字。

Laravel深度應用

加密

有2種方法實現自動加密

  • 如果模型主鍵為id

    透過Hashid提供的trait,在資料庫模型中使用use Hashid;,對結果中的id欄位自動加密成字串,例如:

    
    <?php
    namespace App;

use Illuminate\Database\Eloquent\Model;
use Jiaxincui\Hashid\Traits\Hashid;

class User extends Model
{
use Hashid;

}

* 如果模型中的主鍵不是`id`

  你需要在模型中定義一個訪問器,如你的主鍵為`pid`,在Model中新增訪問器如下:

```php
public function getPidAttribute($value)
{
  return id_encode($value);
}

解密

透過Hashid提供的middleware對路由引數解碼,在控制器中無需做任何操作即可解碼加密後的路由引數。
首先在App\Http\Kernel.php中註冊中介軟體,在Kernel類的$routeMiddleware屬性新增中介軟體條目。例如:

'hashid' => \Jiaxincui\Hashid\Http\Middleware\Hashid::class,

現在你可以在路由中分配中介軟體了。例如:

Route::resource('/users', 'UserController')->middleware('hashid');

中介軟體引數

預設情況下,Hashid中介軟體會解密當前路由的所有路由引數,如果你想指定被解密的路由引數可在中介軟體傳入引數,例如:

Route::get('users/{user}/posts/{post}/comments/{comment}', function ($user, $post, $comment) {
    //
})->middleware('hashid:user,post');

以上例子中介軟體只解密給出的引數,如以上例子會解密路由引數userpost,不會解密commnent

現在你的應用已經具備完整的加密和解密模型ID的功能。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章