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);
});
}