背景
项目在进行等保测试时,发现小程序部分接口通过修改接口参数可以获取到部分敏感信息,属于严重漏洞。为了减少代码改动工作量,考虑使用国密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文件夹,复制出来放到小程序目录中
在请求拦截中统一进行参数加密操作文章来源:https://www.toymoban.com/news/detail-516748.html
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)
}
这样每次发出的请求参数都会被加密处理,后端接收到后进行对应的解密即可。文章来源地址https://www.toymoban.com/news/detail-516748.html
到了这里,关于微信小程序中的SM2加密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!