微信小程序中的SM2加密

背景

项目在进行等保测试时,发现小程序部分接口通过修改接口参数可以获取到部分敏感信息,属于严重漏洞。为了减少代码改动工作量,考虑使用国密SM2对参数进行统一加密后,后端需要解密后再使用。同时考虑到部分响应数据内容过多,如果后端对响应数据也加密,前端解密时间过长影响体验,所以只针对了请求参数加密。

具体实现

一、小程序可配置安全鉴权

微信小程序官方提供了接口通信鉴权体系,使用了数据加密与签名的机制,防止数据泄漏与篡改,且具备不可否认性。开发者可在小程序管理后台 API安全模块,为应用配置密钥与公钥,以此来保障开发者应用和微信开放平台交互的安全性。

安全鉴权模式介绍:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/getting_started/signature-verify.html

服务端api签名指南:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/getting_started/api_signature.html

看完介绍后感觉非常麻烦,而且在社区看到好多加密解密时存在问题。为了减少工作量,尝试选择下面第二种方式。

二、使用sm-crypto

文档地址:https://www.npmjs.com/package/sm-crypto

官方提供了小程序移植版和 java 移植版,如有需要可以参考使用。但因之前项目在管理后台用过,所以就没看文档,直接复制的npm包源码。

官方介绍需要依赖npm构建,因为当前项目没用npm,且只需要SM2,就直接复制了SM2源码放在小程序中。

首先找到源码sm-crypto/src/目录下的sm2文件夹,复制出来放到小程序目录中

在请求拦截中统一进行参数加密操作

const sm2 = require('./sm2/index')

// 下面代码要放在请求拦截中

if (config.data) {
	const publicKey = `xxx`   //  提前调用sm-crypto生成的公钥,需要和后端配合好,保证后端私钥和公钥是一对
	const sm2Data = sm2.doEncrypt(JSON.stringify(config.data), publicKey, 1)  // config.data就是请求参数
	config.data = encodeURIComponent(sm2Data)
}

这样每次发出的请求参数都会被加密处理,后端接收到后进行对应的解密即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值