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中随机显示图片的函数代码
Jun 23 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
Mar 11 PHP
浅析PHP中Collection 类的设计
Jun 21 PHP
php上传文件,创建递归目录的实例代码
Oct 18 PHP
php实现的click captcha点击验证码类实例
Sep 23 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
PHP 验证登陆类分享
Mar 13 PHP
PHP加密解密实例分析
Dec 25 PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 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 动态生成静态HTML页面示例代码
2014/01/15 PHP
smarty中常用方法实例总结
2015/08/07 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
javascript定时变换图片实例代码
2013/03/17 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
用python删除java文件头上版权信息的方法
2014/07/31 Python
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
python中的常量和变量代码详解
2018/07/25 Python
python实现月食效果实例代码
2019/06/18 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
产品包装策划方案
2014/05/18 职场文书
大学生个人求职信例文
2014/07/07 职场文书
环保公益策划方案
2014/08/15 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
校长新学期寄语2016
2015/12/04 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android