Optimización de la seguridad de la interfaz del subprograma WeChat (cifrado AES)

optimización de la interfaz

Antes de la optimización: http://a.com/message.php?page=0

Optimizado:

http://a.com/message.php?page=parameter&openid=identificador único de usuario&t=marca de tiempo&sign=texto cifrado

Por ejemplo:

http://127.0.0.1:808/xiaomi_new/feishu/AES/cs.php?page=11&openid=ou_xxxx

&t=1668575721&sign=eed5d9829f56ee7bf26ec96f2ef1e637

Método de cálculo de signo:

MD5(AES({"página":"11","openid":"ou_xxxx","t":"1668575721"}))

El método de cifrado AES es AES-128-ECB

  • página => parámetro de cambio de página
  • openid => código de identificación único del usuario
  • t => Marca de tiempo//El reloj de referencia es RPC (Beijing establece un reloj de referencia) con una precisión de segundos
  • signo => texto cifrado

Proceso de verificación de firma de back-end

  1. Determine si la marca de tiempo t está dentro de los 30 s. (evitar repetición)
  2. Determine si el openid es incorrecto y si la fecha de inicio de sesión del usuario coincide con la fecha actual. (para evitar el robo de openid)
  3. Cifre la página, el ID abierto, el t y el IP después de obtenerlo y compare el texto cifrado con el signo. (para evitar la manipulación)

POC:http://a.com/message.php?page=2&openid=or_xxxx&t=1667986784472&sign=date

Código de implementación:

Los parámetros se cifran primero con AES-128-ECB y la capa exterior se cifra con md5.

1. Cree una carpeta utils para almacenar las herramientas aes.js, md5.js y aes_util.js.

(1) Introducir CryptoJS y almacenar CryptoJS en aes.js.

                Dirección oficial de CryptoJS : https://github.com/sytelus/CryptoJS

              Copie la dirección directamente: haga clic en el enlace al  archivo CryptoJS

(2) Introduzca el cifrado md5, haga clic en el enlace  cifrado javascript md5               

(3) Encapsular el método de cifrado aes

const CryptoJS = require('./aes'); //引用AES源码js
const utilMd5 = require('./md5');
const key = CryptoJS.enc.Utf8.parse('密钥');
const iv = CryptoJS.enc.Utf8.parse('1234567812345678');
// aes ecb加密方法
function AesEncryptECB(word) {
  let srcs = CryptoJS.enc.Utf8.parse(word);
  let encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  // md5加密
  return utilMd5.hexMD5(encrypted.toString());
}
module.exports = {
  AesEncryptECB
}

2. Utilice una interfaz de cifrado

// 引入
const CryptoJS = require('../..//utils/aes_util') //获取加密组件
  // 获取创意信息
  getDataList() {
    let that = this;
    let timestamp = Date.parse(new Date()) / 1000;
    const data = {
      page: that.data.page.toString(),
      t: timestamp,
      openid: that.data.openId
    }
    // 调用秘钥方法
    let sign = CryptoJS.AesEncryptECB(JSON.stringify(data))
    wx.request({
      url: 'http://xxxxxxxxxxx',
      data: { ...data, sign },
      method: 'GET',
      header: {
        'content-type': 'application/xml'
      },
      success: function (res) {
        let resData = res.data.data;
        console.log(resData)
      },
      fail: function (err) {
        console.log(err)
      },
    })
  },

Supongo que te gusta

Origin blog.csdn.net/TongJ_/article/details/128429258
Recomendado
Clasificación