app接口设计之signature签名的php实现
1、首先说一句什么是接口:接口简单来说就是服务器端用来返回给其他程序或者客户端数据的桥梁
2、接口的作用:根据固定参数返回固定数据,比如客户端传a=1,那么服务器端返回a的姓名,客户端传a=2,服务器端返回a的性别,而不会返回其他数据。
例如:app与服务器端的接口、java与php之间不同程序的接口,这些接口一般通过json格式传输数据
所以为了保证移动端和服务端数据传输相对安全,需要对接口进行加密传输
接口签名验证固定参数:
接口签名验证固定参数是客户端调用所有接口时都需要传递的参数。用于接口版本管理(旧版本的安卓app依然可以使用)、安全校验等目的。
os String 客户端操作系统名称 例如"android", "ios"
uuid String 移动设备唯一标识符 例如安卓手机的IMEI,苹果手机的UUID
version 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);
}