1、首先說一句什么是接口:接口簡單來說就是服務器端用來返回給其他程序或者客戶端數據的橋梁
2、接口的作用:根據固定參數返回固定數據,比如客戶端傳a=1,那么服務器端返回a的姓名,客戶端傳a=2,服務器端返回a的性別,而不會返回其他數據。
例如:app與服務器端的接口、java與php之間不同程序的接口,這些接口一般通過json格式傳輸數據
所以為了保證移動端和服務端數據傳輸相對安全,需要對接口進行加密傳輸
接口簽名驗證固定參數: 接口簽名驗證固定參數是客戶端調用所有接口時都需要傳遞的參數。用于接口版本管理(舊版本的安卓app依然可以使用)、安全校驗等目的。os String 客戶端操作系統名稱 例如"android", "ios"uuid String 移動設備唯一標識符 例如安卓手機的IMEI,蘋果手機的UUIDversion String 客戶端版本號 例如"1.0","2.0"(接口設計高版本接口要兼容低版本的接口)timestamp long 客戶端調用接口時的時間戳signature String 客戶端接口調用簽名簽名算法 Ps: (可以根據實際變更其他算法使用) 對除去signature外的所有參數,按參數名的字典順序排序后計算sha1值。例如,某個接口的參數"mobile=18600933630&verifyCode=135466&os=android&uuid=GB1303EA&version=1.0×tamp=1442067125464" a) 按參數名的字典順序排序成 "mobile=18600933630os=androidtimestamp=1442067125464uuid=GB1303EAverifyCode=135466version=1.0" b) signature值為字符串"mobile=18600933630os=androidtimestamp=1442067125464uuid=GB1303EAverifyCode=135466version=1.0"的sha1值注意:簡而言之,簽名設計的原則就是保證服務器所接收到的數據是自己的APP端傳過來的,而不是其他人非法調用的,在APP端給簽名加密時需要加上特有固定參數,服務器也是加上特有固定參數,從而來保證一對一的傳輸,每個接口都需要調用該簽名驗證方法本項目實現簽名及其驗證的具體代碼(php實現):(1)簽名的驗證方法代碼: // $signtype 'yes':驗證,'no':不驗證 public static function checkSign($args,$signature,$signtype = 'yes') { if($signtype == 'no') //上線時去除該部分,必須驗證簽名 { return true; } if(!$args || !$signature) { return false; } if (time() - $args['timestamp'] > 300) //同一簽名調用時間限制 { return false; } $args['xiaoming'] = 'wuyingqi431'; //特有固定參數 ksort($args); //按數組的鍵排序 $sign = ''; foreach($args as $k => $v) { $sign .= $k . '=' . $v; } $sign = sha1($sign); //加密 if($sign == $signature) { return true; } return false; }(2)簽名驗證方法調用(其他必須傳的固定參數也需要加入到$args數組當中):$args = $res = array();//下面是每個接口的參數(分為固定參數和不固定參數,固定參數必傳)$args['mobile'] = r_get('mobile');//下面是簽名固定參數 $args['os'] = $_POST['os']; $args['uuid'] = $_POST['uuid']; $args['version'] = $_POST['version']; $args['timestamp'] = $_POST['timestamp']; $signature = $_POST['signature']; $signtype = $_POST['signtype']; $check = appuser::checkSign($args,$signature,$signtype); if(!$check) { $res['msg_code'] = 99999; //簽名錯誤 v_json($res); }新聞熱點
疑難解答
圖片精選