微信小程序sm2加密解密封装

思路:

后端获取 公钥和私钥 公钥发给我,我使用他的公钥 将需要加密的数据进行加密传过去 他用自己的私钥解密.

前端获取 公钥和私钥 公钥发给后端 他使用我的公钥 将需要加密的数据进行加密传给我 我用自己的私钥解密

安装

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博客

参考文章 (代码): 前端数据加解密:保护敏感信息的关键_小程序使用国密加密由前端存储密钥会被抓取吗-CSDN博客

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值