在做二維碼兌獎時,發現如果將二維碼的參數暴露,那么惡意的用戶將可以利用參數套取獎品。
所以引發我對hashids的使用需求。當然hashids的使用場景和范圍其實很大。例如對視頻圖片
等資源進行進行id加密,防止被第三方直接遍歷抓取資源。生成指定位數的不重復的用戶的推薦碼等。
hashids的github網址:
https://github.com/vinkla/laravel-hashids
1.在laravel中安裝hashids
composer require vinkla/hashids
2.在config/app.php中的providers數組中添加
Vinkla\Hashids\HashidsServiceProvider::class
3.在config/app.php中的aliases數組中添加
'Hashids' => Vinkla\Hashids\Facades\Hashids::clas
4.以config下生成hashids.php配置文件
php artisan vendor:publish
5.修改hashids.php中的connections的鹽值和加密輸出長度
其中鹽值可以是任意長度任意字符的字符串,加密和鹽值有直接的關系,鹽值是解密的鑰匙。我直接取項目的密鑰作為其鹽值,以讓項目統一,且不同項目的加密結果不一樣。
'connections' => [
'main' => [
'salt' => env('APP_KEY'),
'length' => '16',
],
'alternative' => [
'salt' => env('APP_KEY'),
'length' => '6',
],
'recommend' => [
'salt' => env('APP_KEY'),
'length' => '6',
],
],
6.Hashids的加密解密使用方式
- 加密的使用方式
Hashids::encode(123);//返回經過加密后的字符串a9M4pPZqO0rJ6QWK
- 解密的使用方式
注意返回值是數組
Hashids::decode('a9M4pPZqO0rJ6QWK');//返回經過解密后的數組[123]
- 同時加密多個參數
Hashids::encode(1,2,3);//M0BKxg8cYSNrVAjp
- 解密多個參數的加密字符串
Hashids::decode('M0BKxg8cYSNrVAjp')//返回經過解密后的數組[1,2,3]
- 切換不同的鹽值和加密長度
我們可能需要對多個不同類型的id進行加密,鹽值和返回長度也各有不同。所以config的hashids中的多個數組可以派上用場了。其中main數組是作為默認連接,可以自行添加其他的加密數組。
Hashids::connection('recommend')->encode(1);
Hashids::connection('recommend')->decode("jflkasdjfkasdjfl");