小程序请求的所有接口参数必须加密,后台返回数据也需要加密,并且增加Token验证
一、小程序端功能编写
1.下载一份Js版的aesUtil.js源码。【注:文章末尾会贴出所有的相关类文件】
2.下载一份Js版的md5.js源码。
3.在pulic.js中进行加解密操作代码如下,其中秘钥和秘钥偏移量要与后台的一致。
var CryptoJS = require('aesUtil.js'); //引用AES源码js
var md5 = require('md5.js')
var key = CryptoJS.enc.Utf8.parse("76CAA1C88F7F8D1D"); //十六位十六进制数作为秘钥
var iv = CryptoJS.enc.Utf8.parse('91129048100F0494'); //十六位十六进制数作为秘钥偏移量
//解密方法
function Decrypt(word) {
var encryptedHexStr = CryptoJS.enc.Hex.parse(word);
var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
var decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
//加密方法
function Encrypt(word) {
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString().toUpperCase();
}
//暴露接口
module.exports.Decrypt = Decrypt;
module.exports.Encrypt = Encrypt;
4.在网络请求帮助类中进行参数的加密和返回数据的解密操作。
var aes = require('../utils/public.js')
var md5 = require("../utils/md5.js")
...
/**
* 网络请求
*/
function request(method, loading, url, params, success, fail) {
var url = BASE_URL + url;
//请求参数转为JSON字符串
var jsonStr = JSON.stringify(params);
console.log(url + ' params=> ' + jsonStr)
//根据特定规则生成Token
var token = productionToken(params);
//加密请求参数
var aesData = aes.Encrypt(jsonStr)
console.log('请求=>明文参数:' + jsonStr)
console.log('请求=>加密参数:' + aesData)
...
wx.request({
url: url,
method: method,
header: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
'Token': token
},
data: {
aesData: aesData
},
// data: params,
success: function(res) {
//判断请求结果是否成功
if (res.statusCode == 200 && res.data != '' && res.data != null) {
//解密返回数据
console.log('返回=>加密数据:' + res.data);
var result = aes.Decrypt(res.data);
console.log('返回=>明文数据:'+result);
success(JSON.parse(result))
} else {
fail()
}
},
fail: function(res) {
fail()
},
})
}
其中生成Token的规则,【生成Token的规则可根据具体的业务逻辑自己定义,我这里使用的规则是根据请求参数的字母排序取其value并加上当前时间戳再进行MD5加密】
/**
* 生成Token
*/
function productionToken(params) {
var obj = util.objKeySort(params);
var value = '';
for (var item in obj) {
value += obj[item];
}
//加上当前时间戳
value += util.getTokenDate(new Date())
//去除所有空格
value = value.replace(/\s+/g, "")
//进行UTF-8编码
value = encodeURI(value);
//进行MD5码加密
value = md5.hex_md5(value)
return value;
}
//util的排序函数
function objKeySort(obj) {
//先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
var newkey = Object.keys(obj).sort();
//创建一个新的对象,用于存放排好序的键值对
var newObj = {};
//遍历newkey数组
for (var i = 0; i < newkey.length; i++) {
//向新创建的对象中按照排好的顺序依次增加键值对
newObj[newkey[i]] = obj[newkey[i]];
}
//返回排好序的新对象
return newObj;
}
二、服务端功能编写
由于初学SpringMVC,使用的方式不一定是最优最好的,如有不妥善之处,请各位看官多多指教 思路:
通过过滤器拦截请求参数,通过自定义参数包装器对参数进行解密。 在拦截器获取请求的Token并生成服务器端Token进行验证。 对返回参数通过JSON转换器进行加密处理。
思路图 1.重写HttpServletRequestWrapper,在自定义的HttpServletRequestWrapper 中对参数进行处理