1
2
3
# 网页链接 https://ggzyfw.fj.gov.cn/business/list
# 数据接口 https://ggzyfw.fj.gov.cn/FwPortalApi/Trade/TradeInfo
# 加密字段 请求头中的portal-sign 和 响应数据中的 Data

portal-sign字段解析

  1. 搜索加密字段portal-sign,找到对应的加密函数,打断点查看加密流程

    image-20230410174027382

    image-20230410174140719

  2. 将请求体放入f.getSign()函数中进行加密,查看该函数

    image-20230410174351992

  3. 该函数是将固定字符串和请求体中的部分键值对拼接,然后使用md5加密成32位字符串,可以将该函数扣取出来,补全既可

    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
    function u(t, e) {
    return t.toString().toUpperCase() > e.toString().toUpperCase() ? 1 : t.toString().toUpperCase() == e.toString().toUpperCase() ? 0 : -1
    }

    function l(t) {
    for (var e = Object.keys(t).sort(u), n = "", a = 0; a < e.length; a++)
    if (void 0 !== t[e[a]])
    if (t[e[a]] && t[e[a]] instanceof Object || t[e[a]] instanceof Array) {
    var i = JSON.stringify(t[e[a]]);
    n += e[a] + i
    } else
    n += e[a] + t[e[a]];
    return n
    }

    function d(t) {
    for (var e in t)
    "" !== t[e] && void 0 !== t[e] || delete t[e];
    var n = '3637CB36B2E54A72A7002978D0506CDF' + l(t);
    console.log(n)
    return n.MD5(32).toLocaleLowerCase()
    }

    e = {
    "pageNo": 1, "pageSize": 20, "total": 4153, "AREACODE": "", "M_PROJECT_TYPE": "", "KIND": "GCJS",
    "GGTYPE": "2,3,7", "PROTYPE": "", "timeType": "6", "BeginTime": "2022-10-06 00:00:00",
    "EndTime": "2023-04-06 23:59:59", "createTime": [], "ts": '1680765912258'
    }
    var sign = d(e)
    console.log(sign)
  4. 得到portal-sign 加入请求头,即可获得响应体

    image-20230410174927171

响应体Data解析

  1. 通过搜索response关键字,可以找到js中接收响应数据是怎么进行处理的

    image-20230410180125354

  2. b(e.Data) b函数是对Data数据进行解密,点击查看解密流程

    image-20230410180221572

  3. 是经典的AES CBC加密方式,填充方法是pkcs7,加密的key和偏移值iv都是固定的,直接拿过来扣代码或者直接导包都可以

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    const CryptoJS = require('crypto-js')

    // 解密
    function decrypt(data, key, iv) { //key,iv:16位的字符串
    var key1 = CryptoJS.enc.Utf8.parse(key);
    var iv1 = CryptoJS.enc.Utf8.parse(iv);
    var decrypted = CryptoJS.AES.decrypt(data, key1, {
    iv: iv1,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
    }
    function run(data) {
    var key = "BE45D593014E4A4EB4449737660876CE";
    var iv = "A8909931867B0425";
    var pazzword = data
    pazzword = decrypt(pazzword, key, iv);
    return pazzword
    }