实战:前端接口请求参数混淆|8月更文挑战

实战:前端接口请求参数混淆|8月更文挑战分享一下前东家的技术团队,在请求接口参数的处理上做得一些混淆处理。 安全性是衡量一个项目能否稳定运行的必备条件之一,同时也是一个技术团队的工作质量考核指标。

分享一下前东家的技术团队,在请求接口参数的处理上做得一些混淆处理。

安全性是衡量一个项目能否稳定运行的必备条件之一,同时也是一个技术团队的工作质量考核指标, 虽然从前端的角度出发,没有根本的安全性可言,毕竟前端的所有东西都是对外开放的,不过前端开发者可以通过增加破防门槛,进而提高项目整体安全性。

什么接口需要做参数处理

在接口请求中,尤其是类似登录、注册等包含敏感字段和数据的接口,如果是以明文的方式将数据发送给后端,那会带来极大的安全隐患。所以,要想实现接口参数的非明文传送,就得对参数做一些处理,增加恶意攻击的门槛。

我的建议是,所有的 POST 请求都需要做处理。在标准的接口规范中,POST 请求会处理数据并返回结果,而 GET 更多是获取数据,而非操作数据。

如何处理参数使得激活成功教程门槛更高

我们最开始使用的是对数据做加密处理,先从后端获取加密密钥,请求的时候再通过密钥对数据加密,接口获取到数据后再根据密钥进行解密。

这种方式显然很笨,而且并没有增加被攻击的门槛,只是保证了非明文数据的传输。攻击者依然可以通过接口获取密钥,再根据密钥获取/解密敏感数据,从而实现攻击的目的。

加密不可行,那就前后端一起制定一种规则,将请求数据做混淆处理,后端根据规则解析出原始数据,那么只要保证这种规则不泄露出去,并不定期更新混淆规则,即可以一定程度增加参数激活成功教程和接口暴力请求的门槛。

具体规则

1、 得到业务参数(JSON格式)

2、 将业务参数进行加密 (规则:所有的key按照 a-z的顺序进行排列 然后用&进行拼接,然后md5得到字符串sign,并把里面的小写字母全部转成大写)

3、把生成的 sign 进行截取(去掉前三位和后五位)得到最终的sign

4、把最终的 sign 添加到业务请求参数中 key固定为 sign,value为第3步生成的值

5、随机产生一个16位的字符串(数字+大学字母),作为原始秘钥

6、把4生成的值作为明文,5生成的值作为最终秘钥,然后进行AES加密 得到最后的数据

7、把6生成的数据作为 value,key 固定为 data,然后再把原始的k(截取和转大写之前的值)作为value,key为k

示例:

image.png

实战:前端接口请求参数混淆|8月更文挑战

前端实现

安装 CryptoJS


npm install crypto-js

引入CryptoJS和MD5JS

MD5JS 库需额外下载引入。


import cryptoJs from 'crypto-js';

import {

  hex_md5

} from "./md5";

混淆算法


/**  * apiEncode 请求参数混淆  * @param {Object} params   */

export const apiEncode = (params) => {

  // 字典排序

  var arr = Object.keys(params).sort();

  var result = {};

  arr.map(m => {

    result[m] = params[m];

  });

  // 处理成query

  var str = [];

  for (var p in result)

    if (result.hasOwnProperty(p)) {

      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(result[p]));

    }

  result = str.join("&");

  // MD5加密并转换大写,截取并拼接到原始参数

  let sign = hex_md5(result).toUpperCase();

  params.sign = sign.substring(3, sign.length - 5);

  // 生成KEY,加密处理

  let key = generateMixed(16);

  let enc = cryptoJs.AES.encrypt(JSON.stringify(params), cryptoJs.enc.Utf8.parse(key), {

    mode: cryptoJs.mode.ECB,

    padding: cryptoJs.pad.Pkcs7

  });

  return JSON.stringify({

    data: enc.toString(),

    k: key

  });

}

/**  * 随机生成指定长度的字符串  * @param {Int} n 长度  */

export const generateMixed = (n) => {

  let chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

  let res = "";

  for (let i = 0; i < n; i++) {

    let id = Math.ceil(Math.random() * 35);

    res += chars[id];

  }

  return res;

}

今天的文章实战:前端接口请求参数混淆|8月更文挑战分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22701.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注