個人理解:接口簡單來講就是服務器端用來返回給其餘程序或者客戶端數據的橋樑。算法
1. 防止假裝攻擊(不知明方調用接口)數組
2. 防止請求篡改(請求的參數被篡改)安全
3. 防止重複攻擊(請求被截獲,被再次惡意調用)服務器
3. 防止數據泄露(如登錄、支付信息)網絡
1. 服務端分配客戶端特定的調用帳號信息:app
AppID:調用方身份ID,接口提供方用此來識別調不一樣的調用者編碼
App_secret:用於生成簽名sign加密
2. 接口調用方和接口提供方約定好統一的簽名加密算法spa
3. 接口調用必要傳入參數code
參數名 | 類型 | 必選 | 描述 |
AppId | string | 是 | 調用方身份ID,接口提供方用此來識別調不一樣的調用者 |
paramet | mix | 否 | 請求參數 |
timestamp | int | 是 | 時間戳 |
sign | string | 是 | 一次接口調用的簽名值,服務器端 「防止 假裝請求/防篡改/ 防重發」 識別的重要依據。 |
1. 對除簽名外的全部請求參數按key作的升序排列,value無需編碼。
(假設當前時間的時間戳是12345678,appid爲 testid)
例如:調用接口 www.example.com/v1/user/edit?c=3&b=2&a=1×tamp=12345678
有c=3,b=2,a=1 三個參,另加上時間戳後, 按key排序後爲:a=1,b=2,c=3,timestamp=12345678。
2. 把參數名和參數值鏈接成字符串,獲得拼裝字符:a1b2c3timestamp12345678
3. 用申請到的appsecret 鏈接到接拼裝字符串頭部和尾部,而後進行32位MD5加密,最後將到得MD5加密摘要轉化成大寫。
示例:假設appkey=test256,strtouppermd5(test256a1b2c3timestamp12345678test256),取得MD5摘要值 C5F3EB5D7DC2748AED89E90AF00081E6 。
此時最終調用: www.example.com/v1/user/edit?c=3&b=2&a=1×tamp=12345678&appid=testid&sign=C5F3EB5D7DC2748AED89E90AF00081E6
1 # 簽名的驗證方法代碼:
2 # $signtype 'yes':驗證,'no':不驗證
3
4 public function checkSign($args,$signature,$signtype = 'yes')
5 { 6 if($signtype == 'no') //上線時去除該部分,必須驗證簽名 7 { 8 return true; 9 } 10 if(!$args || !$signature) 11 { 12 return false; 13 } 14 15 //同一簽名調用時間限制,能夠設定 20s,50s,300s,避免屢次重複調用 16 if (time() - $args['timestamp'] > 300) 17 { 18 return false; 19 } 20 21 //驗證 appid 身份合法性,根據appid查詢對應的 appsecret 22 $model=Model::where("appid=:appid")->find(); 23 if($model){ 24 $serverSecret=$model->appsecret; 25 }else{ 26 return false; 27 } 28 29 //驗證簽名 30 ksort($args); //按數組的鍵排序 31 $sign = ''; 32 33 foreach($args as $k => $v) 34 { 35 $sign .= $k . '=' . $v; 36 } 37 $sign = MD5($serverSecret.$sign.$serverSecret); //加密 38 if($sign == $signature) 39 { 40 return true; 41 } 42 return false; 43 }
總結: