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 相关文章推荐
操作Oracle的php类
Oct 09 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
通过php快速统计某个数据库中每张表的数据量
Sep 04 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
PHP防止表单重复提交的几种常用方法汇总
Aug 19 PHP
php生成QRcode实例
Sep 22 PHP
php实现的支持断点续传的文件下载类
Sep 23 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
2款PHP无限级分类实例代码
Nov 11 PHP
PHP单例模式简单用法示例
Jun 23 PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 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+MYSQL开发工具及资源收藏
2007/01/02 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
深入php函数file_get_contents超时处理的方法详解
2013/06/03 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
JavaScript delete 属性的使用
2009/10/08 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
js document.write()使用介绍
2014/02/21 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
详解python字节码
2018/02/07 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
python中最小二乘法详细讲解
2021/02/19 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
英文自荐信
2013/12/19 职场文书
安全教育心得体会
2013/12/29 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle