欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php-app开发接口加密详解

程序员文章站 2023-11-06 21:01:28
自己平时工作中用到的一套接口加密规则,记录下来以后用: /** inc 解析接口 客户端接口传输规则: 1.用cmd参数(base64)来动态调用不同的...

自己平时工作中用到的一套接口加密规则,记录下来以后用:

/**
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($param as $key=>$val){
  $sb .= $key . '=' . $val . '&';
}
$sb .= $xpp_key;
$server_sign = md5($sb);
 
//将sign与客户端传过来的sign进行比对,如不一样则可能是中途被篡改参数,服务器拒绝此次请求
if($server_sign !== $client_sign){
  echo json_encode(array('code'=>'invalid request'));
  exit;
}
 
//将sign与session中的sign对比,如果一样,则为重复提交,服务器拒绝此次请求
if($server_sign == $_session['last_sign']){
  echo json_encode(array('code'=>'repeated requests'));
  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($param as $key => $val){
  $_request[$key] = $val;
}

客户端代码demo:

package com.xpplove.newxpp.activity;
import java.util.hashmap;
import java.util.iterator;
import java.util.map;
import java.util.treemap;
import org.apache.commons.codec.binary.base64;
import android.os.bundle;
import com.alibaba.fastjson.json;
import com.xpplove.newxpp.baseactivity;
import com.xpplove.newxpp.bean.params;
import com.xpplove.newxpp.net.netposttask;
import com.xpplove.newxpp.utils.densityutil;
public class testactivity extends baseactivity {
  private string url = "http://c.lovexpp.com/";
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    loadmesage();
  }
  private void loadmesage() {
    base64 base64 = new base64();
    map<string, string> paramsmap = new hashmap<string, string>();
    paramsmap.put("timestamp", (system.currenttimemillis() / 1000 + ""));
    string cmd = new string(base64.encode("user-camlist".getbytes()));
    string dcmd = new string(base64.decode(cmd.getbytes()));
    paramsmap.put("cmd", cmd);
    paramsmap.put("sign", getstring(paramsmap));
    string str = getkeyvalues(paramsmap);
    paramsmap = new hashmap<string, string>();
    paramsmap.put("param", str);
    params params = new params();
    params.listener = this;
    params.url = url;
    //new networktask().executeproxy(params);
    new netposttask(paramsmap).executeproxy(params);
  }
  @override
  public void ongetresult(int errorcode, object result) {
    super.ongetresult(errorcode, result);
    system.out.println();
  }
  private string getstring(map<string, string> paramsmap) {
    treemap tm = new treemap(paramsmap);
    iterator i = tm.descendingmap().entryset().iterator();
    stringbuffer buffer = new stringbuffer();
    while (i.hasnext()) {
      buffer.append(i.next() + "&");
    }
    buffer.append(appkey);
    return densityutil.md5(buffer.tostring());
  }
  // 得到键值对
  private string getkeyvalues(map<string, string> paramsmap) {
    treemap tm = new treemap(paramsmap);
    iterator i = tm.descendingkeyset().iterator();
    string jsontext = json.tojsonstring(tm.descendingmap(), true);
    return jsontext;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。