php-app开发接口加密详解
自己平时工作中用到的一套接口加密规则,记录下来以后用:
/**
inc
解析接口
客户端接口传输规则:
1.用cmd参数(base64)来动态调用不同的接口,接口地址统一为http://a.lovexpp.com
2.将要传过来的参数组成一个数组,数组添加timestamp元素(当前时间戳,精确到秒),将数组的键值按照自然排序从大到小排序
3.将数组组成key=val&key=val的形式的字符串,将字符串与XPP_KEY连接在一起,用md5加密一次(32位小写),得到sign
4.将sign添加到参数数组中
5.将参数数组转换成json用post请求请求接口地址,key值为param
服务端接口解析规则:
1.接收参数param,将结果解析json得到参数数组
2.取出sign,去掉参数数组中的sign
3.将参数数组key值按照自然排序从大到小排序
4.将排序后的参数数组按照key=val&key=val的形式组成字符串,将字符串与XPP_KEY连接,用md5加密一次(32位小写),得到sign
5.将sign与客户端传过来的sign进行比对,如不一样则可能是中途被篡改参数,服务器拒绝此次请求
6.将sign与session中的sign对比,如果一样,则为重复提交,服务器拒绝此次请求
7.此次的sign存入session
8.执行路由cmd(base64解析后),将参数带到该方法中
*/
$xpp_key="xxx";
//接收参数param,将结果解析json得到参数数组
$param=json_decode($_POST['param'],true);
//取出sign,去掉参数数组中的sign
$client_sign=$param['sign'];
unset($param['sign']);
//将参数数组key值按照自然排序从大到小排序
krsort($param);
//将排序后的参数数组按照key=val&key=val的形式组成字符串,将字符串与XPP_KEY连接,用md5加密一次(32位小写),得到sign
$sb='';
foreach($paramas$key=>$val){
$sb.=$key.'='.$val.'&';
}
$sb.=$xpp_key;
$server_sign=md5($sb);
//将sign与客户端传过来的sign进行比对,如不一样则可能是中途被篡改参数,服务器拒绝此次请求
if($server_sign!==$client_sign){
echojson_encode(array('code'=>'invalidrequest'));
exit;
}
//将sign与session中的sign对比,如果一样,则为重复提交,服务器拒绝此次请求
if($server_sign==$_SESSION['last_sign']){
echojson_encode(array('code'=>'Repeatedrequests'));
exit();
}
//此次的sign存入session
$_SESSION['last_sign']=$server_sign;
//执行路由cmd(base64解析后),将参数带到该方法中
$cmd=base64_decode($param['cmd']);
list($__controller,$__action)=explode('-',$cmd);
//设置请求参数
unset($param['cmd']);
unset($param['timestamp']);
foreach($paramas$key=>$val){
$_REQUEST[$key]=$val;
}
客户端代码demo:
packagecom.xpplove.newxpp.activity;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.TreeMap;
importorg.apache.commons.codec.binary.Base64;
importandroid.os.Bundle;
importcom.alibaba.fastjson.JSON;
importcom.xpplove.newxpp.BaseActivity;
importcom.xpplove.newxpp.bean.Params;
importcom.xpplove.newxpp.net.NetPostTask;
importcom.xpplove.newxpp.utils.DensityUtil;
publicclassTestActivityextendsBaseActivity{
privateStringurl="http://c.lovexpp.com/";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
loadMesage();
}
privatevoidloadMesage(){
Base64base64=newBase64();
MapparamsMap=newHashMap();
paramsMap.put("timestamp",(System.currentTimeMillis()/1000+""));
Stringcmd=newString(base64.encode("user-camList".getBytes()));
Stringdcmd=newString(base64.decode(cmd.getBytes()));
paramsMap.put("cmd",cmd);
paramsMap.put("sign",getString(paramsMap));
Stringstr=getKeyValues(paramsMap);
paramsMap=newHashMap();
paramsMap.put("param",str);
Paramsparams=newParams();
params.listener=this;
params.url=url;
//newNetWorkTask().executeProxy(params);
newNetPostTask(paramsMap).executeProxy(params);
}
@Override
publicvoidonGetResult(interrorCode,Objectresult){
super.onGetResult(errorCode,result);
System.out.println();
}
privateStringgetString(MapparamsMap){
TreeMaptm=newTreeMap(paramsMap);
Iteratori=tm.descendingMap().entrySet().iterator();
StringBufferbuffer=newStringBuffer();
while(i.hasNext()){
buffer.append(i.next()+"&");
}
buffer.append(AppKey);
returnDensityUtil.MD5(buffer.toString());
}
//得到键值对
privateStringgetKeyValues(MapparamsMap){
TreeMaptm=newTreeMap(paramsMap);
Iteratori=tm.descendingKeySet().iterator();
StringjsonText=JSON.toJSONString(tm.descendingMap(),true);
returnjsonText;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。