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.MVC的模板标签系统(二)
Sep 05 PHP
最小化数据传输――在客户端存储数据
Oct 09 PHP
用来解析.htgroup文件的PHP类
Sep 05 PHP
PHP处理excel cvs表格的方法实例介绍
May 13 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
Win7 64位系统下PHP连接Oracle数据库
Aug 20 PHP
php实现的替换敏感字符串类实例
Sep 22 PHP
php判断当前用户已在别处登录的方法
Jan 06 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 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和AJAX创建RSS聚合器的代码
2007/03/13 PHP
PHP 错误之引号中使用变量
2009/05/04 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
JavaScript的Cookies
2008/01/16 Javascript
javascript 打印页面代码
2009/03/24 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
javascript history对象详解
2017/02/09 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
python实现的简单窗口倒计时界面实例
2015/05/05 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
python如何调用字典的key
2020/05/25 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
财务人员求职自荐书范文
2014/02/10 职场文书
项目合作协议书范本
2014/04/16 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
遗失说明具结保证书
2015/02/26 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
vue使用echarts实现折线图
2022/03/21 Vue.js