首頁 > 後端開發 > php教程 > php-app開發介面加密

php-app開發介面加密

不言
發布: 2023-03-24 10:40:01
原創
1823 人瀏覽過

這篇文章主要為大家詳細介紹了php-app開發介面加密規則,具有一定的參考價值,有興趣的小夥伴們可以參考一下

自己平常工作中用到的一套介面加密規則,記錄下來以後用:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

/**

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:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

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-app介面實作(json和xml)

以上是php-app開發介面加密的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
PHP中文網有沒有APP?
來自於 1970-01-01 08:00:00
0
0
0
php給app做支付接口
來自於 1970-01-01 08:00:00
0
0
0
php - laravel中app key作用?
來自於 1970-01-01 08:00:00
0
0
0
app,把網頁寫成app
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板