大家好,我是书江。在平时的开发过程中,有没有遇到过跟后台上线的时候,后台说:“乞兔子,这个接口的数据需要加密”“乞兔子,这个接口返回的数据需要解密》那么到底在什么场景下需要对接口数据进行加密或者解密呢?场景一:登录在数据安全的背景下,大多数登录界面都需要客户端对用户的用户名、密码等信息进行加密。举个场景:出于安全考虑,后端通知前端调整登录界面时,需要先对用户的登录信息进行AES加密。我们用接口管理工具Apifox来验??证一下:Apifox是国内非常流行的接口管理神器,支持事前操作和事后操作。一般情况下,接口的数据在发送请求之前需要做进一步的处理。我们可以通过在预操作中添加脚本来对用户登录数据进行加密,那么如何通过Apifox的预操作对密码进行加密呢?首先在调试界面body中定义如下字段password:存放加密后的数据,并设置变量{{password}}password2:定义加密前的原始数据接下来我们在前台操作面板中编写前台脚本。同时,Apifox内置了crypto-js库,基本可以实现各种加解密算法。这次使用的是AES算法。步骤如下:1.引入crypto-js内置库2.通过pm.request.body.formdata获取password2参数3.加密数据varcryptoJs=require("crypto-js");constpassword2=pm.request.body.formdata.get("password2")constkey=cryptoJs.enc.Utf8.parse('******');constiv=cryptoJs.enc.Utf8.parse('******');constencrypted=cryptoJs.AES.encrypt(password2,key,{iv:iv,模式:cryptoJs.mode.CBC,填充:cryptoJs.pad.Pkcs7});完成以上步骤后,就可以加密数据了。场景二:接口签名接口签名是接口请求的常见场景,那么为什么要对接口进行签名呢?通常是为了防止参数被篡改。接口签名,一般操作步骤为:拼接成字符串:将非空请求参数按照请求参数名从小到大的顺序排列,使用URL键值对格式(即key1=value1&key2=value2...)来拼接成字符串stringA;spliceSecretkey:将stringA末尾的Secretkey拼接得到字符串stringSignTemp;MD5加密:对stringSignTemp进行MD5运算;获取符号值:将获取到的字符串的所有字符全部转为大写,获取符号值。这里我们以微信支付签名为例:微信支付签名,在Apifox接口工具中需要接口签名的接口如何调试,怎么实现呢?基于上面的微信支付官方签名demo,我们首先定义Query参数:然后在前置脚本中编辑签名脚本,写好后点击发送,可以看到右边的控制台输出了最终的签名数据;上图中完整版脚本如下://获取预先设置为环境变量的APPKEYletkey=pm.environment.get("APPKEY");//存储所有需要的参数用于签名letparam={};//添加查询参数letqueryParams=pm.request.url.query;queryParams.each(item=>{if(!item.disabled&&item.value!==''){//只有参数值非空的启用参数才参与签名param[item.key]=item.value;}});//添加body参数if(pm.request.body){letformData;switch(pm.request.body.mode){case'formdata':formData=pm.request.body.formdata;休息;默认值:中断;}if(formData){formData.each(item=>{if(!item.disabled&&item.value!==''){//启用且不为空只有有参数值的参数才能参与签名param[item.key]=item.value;}});}}//取keyletkeys=[];for(letkeyinparam){//这里注意,要去掉sign参数本身if(key!=='sign'){keys.push(键);}}//参数名的ASCII码从小到大排序(字典顺序)keys.sort();//转换为键值对letparamPair=[];for(leti=0,len=keys.length;i