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 相关文章推荐
PHP 程序员的调试技术小结
Nov 15 PHP
php笔记之常用文件操作
Oct 12 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
解析php入库和出库
Jun 25 PHP
php教程之phpize使用方法
Feb 12 PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
详解php中反射的应用
Mar 15 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP以json或xml格式返回请求数据的方法
May 31 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 5.4 你必须要知道的
2013/08/07 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
python3操作微信itchat实现发送图片
2018/02/24 Python
python微信撤回监测代码
2019/04/29 Python
python实现的config文件读写功能示例
2019/09/24 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
记帐员岗位责任制
2014/02/08 职场文书
技校毕业生自荐信
2014/06/03 职场文书
幼儿园运动会口号
2014/06/07 职场文书
团队拓展活动方案
2014/08/28 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
党员演讲稿
2014/09/04 职场文书
数学教师求职信范文
2015/03/20 职场文书
行政处罚告知书
2015/07/01 职场文书
数学备课组工作总结
2015/08/12 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL