php-app开发接口加密详解


Posted in PHP onApril 18, 2018

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

/**
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;
  }
}

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

PHP 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
PHP数组内存耗用太多问题的解决方法
Apr 05 PHP
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
基于PHP编程注意事项的小结
Apr 27 PHP
php设计模式之命令模式的应用详解
May 21 PHP
PHP 二维数组根据某个字段排序的具体实现
Jun 03 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
php制作文本式留言板
Mar 18 PHP
PHP实现路由映射到指定控制器
Aug 13 PHP
php实现断点续传大文件示例代码
Jun 19 PHP
PHPMAILER实现PHP发邮件功能
Apr 18 #PHP
PHP实现数据库的增删查改功能及完整代码
Apr 18 #PHP
php无限级评论嵌套实现代码
Apr 18 #PHP
PHP实现负载均衡下的session共用功能
Apr 17 #PHP
PHP代码重构方法漫谈
Apr 17 #PHP
php微信公众号开发之现金红包
Apr 16 #PHP
PHP闭包定义与使用简单示例
Apr 13 #PHP
You might like
php 静态变量的初始化
2009/11/15 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
PHP中的Memcache详解
2014/04/05 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
浅析js中的浮点型运算问题
2014/01/06 Javascript
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
简单介绍django提供的加密算法
2019/12/18 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
python实现简单的五子棋游戏
2020/09/01 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
年度考核自我评价
2014/01/25 职场文书
安全教育感言
2014/03/04 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
科学发展观标语
2014/10/08 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
经理聘任证明
2015/03/02 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
Python实现抖音热搜定时爬取功能
2022/03/16 Python
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技