微信小程序接口加密机制

2025-12-10 15:54:56 阅读:5 编辑
 api(url,data, success_callback) {

    const RSA_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5sUyaU+ca/lzkOHVf1Ne
US3XmGEJGrlVthHJWmSRsiU6drNZign1UmWxeun+oqfsEikA9v2xZK2p5H54gkOr
mhZzWLelzdNNqaMcoGzaEUN2wRS8Y9csXyR3mGuPhy6YNFp06jkwdBPjs3mlyUfi
oRgGdau7/pGeSO+4ogHCaH1AYHRPl6DDODTGRI1HNFQKDBzhio5iLQja9lCHqpLc
G/es7Y49koGdIHSOyn22NSqXvX/sijb6wx3dGFsOr/FFiVzOMqNB1b3qrUT95noJ
fVw+LgtOhBHDKhyPOWWPToniMRW59MjaCD69/fi0G1X1pX/sdBqKTQE3t9wQc8GM
WwIDAQAB
-----END PUBLIC KEY-----`;
 // 1. 使用微信小程序API生成安全的随机字节,并转换为Base64格式的AES密钥和IV
    // 注意:这里是一个Promise封装,因为微信API是回调形式
    const  getRandomBase64 = (byteLength) => {
      return new Promise((resolve, reject) => {
          const userCryptoManager = wx.getUserCryptoManager();
          userCryptoManager.getRandomValues({
              length: byteLength,
              success: res => {
                  // 将 ArrayBuffer 转换为 Base64 字符串
                  const base64 = wx.arrayBufferToBase64(res.randomValues);
                  resolve(base64);
              },
              fail: reject
          });
      });
  };
    Promise.all([
  getRandomBase64(32), // AES-256密钥
  getRandomBase64(16)  // CBC模式需要的初始向量
]).then(([aesKey, aesIv]) => {
    console.log("aesKey",aesKey);
    // 2. 使用AES加密请求数据
    const dataString = JSON.stringify(data);
    const aesEncrypted = CryptoJS.AES.encrypt(dataString, CryptoJS.enc.Base64.parse(aesKey), {
        iv: CryptoJS.enc.Base64.parse(aesIv),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    }).ciphertext.toString(CryptoJS.enc.Base64);

    // 3. 使用RSA加密AES密钥
    const encryptor = new JSEncrypt();
    encryptor.setPublicKey(RSA_PUBLIC_KEY);
    const rsaEncryptedAesKey = encryptor.encrypt(aesKey);

    if (!rsaEncryptedAesKey) {
        throw new Error('RSA加密失败,请检查公钥格式');
    }

    wx.request({
      url: url, //仅为示例,并非真实的接口地址
      method:"POST",
      data: {
        en_data:aesEncrypted
      },
      header: {
        'content-type': 'application/json', // 默认值
        'X-Encrypted-AES-Key': rsaEncryptedAesKey,
        'X-AES-IV': aesIv,
      },
      success (res) {
        console.log(res.data);
        if(success_callback){
          success_callback(res.data);
        }
      }
    })
  }).catch(err => {
    console.error('获取随机密钥失败:', err);
  });
  }