WeChat アプレット インターフェイス セキュリティの最適化 (AES 暗号化)

インターフェイスの最適化

最適化前: http://a.com/message.php?page=0

最適化:

http://a.com/message.php?page=parameter&openid=ユーザー固有識別子&t=タイムスタンプ&sign=暗号文

例えば:

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

&t=1668575721&sign=eed5d9829f56ee7bf26ec96f2ef1e637

符号の計算方法:

MD5(AES({"ページ":"11","openid":"ou_xxxx","t":"1668575721"})))

AES 暗号化方式は AES-128-ECB です

  • page => ページめくりパラメータ
  • openid => ユーザー固有の識別コード
  • t => タイムスタンプ//基準クロックは秒単位の精度の RPC (北京が基準クロックを確立)
  • 符号 => 暗号文

バックエンドの署名検証プロセス

  1. t タイムスタンプが 30 秒以内かどうかを判断します。(リプレイ防止)
  2. openid が正しくないかどうか、およびユーザーのログイン日が現在の日付と一致するかどうかを判別してください。(openid の盗難を防ぐため)
  3. ページ&openid&t&ipを取得後暗号化し、暗号文と符号を比較します。(改ざん防止のため)

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

実装コード:

パラメータは最初に AES-128-ECB で暗号化され、外側の層は md5 で暗号化されます。

1. aes.js、md5.js、および aes_util.js ツールを格納するための utils フォルダーを作成します。

(1) CryptoJSを導入し、CryptoJS をaes.js に格納します。

                CryptoJS 公式アドレス: https://github.com/sytelus/CryptoJS

              アドレスを直接コピーします。CryptoJS ファイルへのリンクをクリックします。 

(2) md5 暗号化を紹介し、リンクをクリックします javascript md5 暗号化               

(3) 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. ase 暗号化インターフェイスを使用する

// 引入
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)
      },
    })
  },

おすすめ

転載: blog.csdn.net/TongJ_/article/details/128429258
おすすめ