当前位置: 首页 > 后端技术 > Node.js

一个项目中签名校验和加密的一些坑(主要是数据格式问题)

时间:2023-04-03 23:38:47 Node.js

最近接手了一个项目,算是一个比较完整的项目。我需要修改它。基于vuecli3.0+webpack开发。这里面有一个功能就是我们要对每一个请求进行一次签名校验,也就是拿一些字符串进行加密,然后在请求头中加上签名校验。后台也使用相同的算法进行加密比对。这个函数本身是写的,但是我们之间存在一些问题。加密字段是按字母顺序传递参数,然后取第一个参数的前三位和最后一个参数的后三位。这很简单。使用sort()方法对其进行排序。第一个问题是axios直接传值给服务端会认为是字符串,所以拦截的时候,符号也会被拦截。一般会变成{"+排序第一个参数的首字母,排序最后一个参数的最后一个字母+"},显然是有问题的。不过这个方案也简单,直接用qs插件处理即可。这里我做了一个处理。如果requestData是字符串,使用requestData.split('&').sort().join('').replace(/([^=>><])=([^=>><])/g,'$1??$2');如果是对象,使用for(variinrequestData){dataString+=`${i}${requestData[i]}&`}dataString=dataString.split('&').sort().join('')forsorting解决了大部分问题,但是昨天突然有个模块说签名校验不够我很奇怪,于是让后端小哥把未加密的字符串返回给我对比。首先,我按照上面说的截取符号,用简单的qs进行处理。那么这里的问题就是,如果qs处理后的参数中有中文,后端收到的其实是中文,但是qs本身会对中文进行encodeURIComponent转码。这个过程也很简单。使用decodeURIComponent()函数对其进行解码。