之前生成的sign和校驗sign我們已經完全掌握了,但是僅僅憑藉這樣的sign是無法滿足我們的需求的,如果一個黑客通過抓包抓到你的數據,他可以去修改你的header爲這樣的,body爲那樣的,也是可以通過sign校驗的,那麼我們怎麼解決呢?下面將詳細的爲大家解說:
首先想到這樣的一個問題,我麼首先應當考慮到的就是sign的時效性問題。如果,我們的sign只有十秒的時間 那就算抓包,他也只能在這十秒裏使用,那麼有了這個想法之後,我們是否應當在生成sign之前加入 time參數呢? 那麼這個time具體怎麼加入呢?
我們先建立一個 Time 類,來生成我們sign所需要的time
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/16
* Time: 10:20
*/
namespace app\common\lib;
/***
* 生成以時間戳拼接的13位字符串
* Class Time
* @package app\common\lib
*/
class Time
{
public static function get13TimeStamp(){
list($t1, $t2) = explode(' ', microtime());
##*1000增加唯一性 避免重複
return $t2 . ceil($t1*1000);
}
}
創建好我們時間生成類之後,我們需要在,生成sign的時候加入time 參數
'time' => Time::get13TimeStamp(),
然後生成sign
IAuth::setSign($data)
生成之後,我們就會獲得到加入 time 參數之後返回的sign了
接下來我們拿到這個sign之後進行校驗
我們需要修改下我們的校驗方法 checkSignPass 使time參數參與進來
新增判斷
//乘除1000增加唯一性
if((time() - ceil($arr['time']/1000)) > config('app.app_sign_time')){
return false;
}
其中 config(“app.app_sign_time”) 是我在配置文件中配置的
return [
'aeskey' => 'asdasd4wq5646', #AES祕鑰 服務端必須和客戶端保持一致
'method' => 'AES-128-ECB',
'iv' => '',
'options' => '0',
'app_types' => [
'ios',
'android',
],
'app_sign_time' => 60,
];
這樣,我們就成功的將時間加入到了 sign 中 ,但是,這樣的話,還是不能保證我們數據的 安全性 我們需要進一步的是sign有更高一級的安全性(唯一性)纔行,那麼怎麼做呢 ?後面會繼續分享
如需瞭解更多,可以查看下一篇文章,我們將講解sign的唯一性淺談API開發安全之sign的唯一性(四)