思路:
后端获取 公钥和私钥 公钥发给我,我使用他的公钥 将需要加密的数据进行加密传过去 他用自己的私钥解密.
前端获取 公钥和私钥 公钥发给后端 他使用我的公钥 将需要加密的数据进行加密传给我 我用自己的私钥解密
安装
npm install miniprogram-sm-crypto --save
request.js
const baseUrl = '后端接口域名或ip/api';
const { sm2Encrypt, sm2Decrypt } = require('./secret');//引入加密模块
//secret 是否需要加密 在api.js中设置
function request(method, url, data, secret) {
return new Promise((resolve, reject) => {
let header = {
'content-type': 'application/x-www-form-urlencoded'
};
let data2 = data
//secret等于1 则进行加密
if (secret == 1) {
const encryptedData = sm2Encrypt(data);
// console.log('加密后的数据:', encryptedData);
data2 = {
publicKey: wx.getStorageSync('publicKey'),//携带的我的公钥
data: encryptedData,//需要传给后端的加密数据
dataType: 1,//告诉后端需要解密
}
}
wx.request({
url: baseUrl + url,
method: method,
header: header,
data: data2,
success: (res) => {
// 解密数据
if (res.data.dataType == 1) {
let jie = res.data.data.data
const decryptedData = sm2Decrypt(jie);
res.data.data = JSON.parse(decryptedData)
}
resolve(res);
},
fail: (err) => {
reject(err);
}
})
})
}
module.exports = {
request
}
secret.js
// 引入 miniprogram-sm-crypto 库中的 SM2 模块
const sm2 = require("miniprogram-sm-crypto").sm2;
const keyPair = sm2.generateKeyPairHex();
const publicKey = keyPair.publicKey; //获取公钥
const privateKey = keyPair.privateKey;//获取私钥
wx.setStorageSync('publicKey', keyPair.publicKey)//存入公钥
wx.setStorageSync('privateKey', keyPair.privateKey)//存入私钥
console.log("公钥:", publicKey);
console.log("私钥:", privateKey);
// SM2加密函数
function sm2Encrypt(msgString) {
//获取后台给我的公钥(我用后端给我的公钥加密,发给他,他用自己的私钥解密)
let publicKey2 = wx.getStorageSync('afterPublicKey')
let msg = msgString;
// 检查传入的消息是否为字符串,如果不是字符串则转换为 JSON 字符串
if (typeof msgString !== "string") {
msg = JSON.stringify(msgString);
}
let cipherMode = 1; // 加密模式固定为1
let publicKey = publicKey2//后台给我的sm2公钥; // SM2公钥
// 使用 SM2 加密算法对消息进行加密
let encryptData = sm2.doEncrypt(msg, publicKey, cipherMode); // 加密结果
return encryptData;
}
// SM2解密函数
function sm2Decrypt(msgString) {
//获取我的私钥(后台用我的公钥进行加密我用自己的私钥解密)
let privateKey2 = wx.getStorageSync('privateKey')
let msg = msgString;
let cipherMode = 1; // 解密模式固定为1
let privateKey = privateKey2//"你的sm2私钥"; // SM2私钥
// 使用 SM2 解密算法对消息进行解密
let decryptData = sm2.doDecrypt(msg, privateKey, cipherMode); // 解密结果
return decryptData;
}
// 导出加密和解密函数
module.exports = {
sm2Encrypt,
sm2Decrypt,
};
api.js
const request = require('./request').request;
const GET = 'GET';
const POST = 'POST';
const Api= {
//测试 政策法规加密
IndexgetPolicy: (data) => request(POST, '/index/getPolicy', data,1),
//获取后台公钥
getPublicKey: (data) => request(POST, '/test/getPublicKey', data,0),
};
module.exports = {
Api
}
获取后端公钥(找合适的地方调用接口)
//获取后端公钥
$api.getPublicKey({
}).then((res) => {
//存入后端公钥
wx.setStorageSync('afterPublicKey', res.data.result.publicKey)
})
参考文章 (安装):微信小程序开发:npm的使用_require args is 'miniprogram-sm-crypto-CSDN博客