类似这样的数据:
data={
"key1":{
a:[1,2],
b:{
"c":1,
"d":2
}
},
"key2":[2,3]
}
进行这样的签名:【将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再做MD5加密生成sign】,由于数据里面的value有的是数组 有的是object,要怎么样转化为“拼接成key1 = value1 & key2 = value2的格式”这样的格式啊,value会出现这样[object Object];这种情况怎么和ios协商md5加密方法呢?
把整个data用JSON.stringify转化为字符串?可是data是object,key-value object本身就是无序的把? 前后端的md5加密 你们是怎么弄的呢?
把data的keys先排序然后拼接成key1 = value1 & key2 = value2的格式(value转成JSON.stringify转化为字符串)
不是无序,也不一定就是这个顺序,可以了解一下js对象构建顺序以及不通环境下遍历的顺序条件,但stringify应该是按照构建顺序进行字符串的,我觉得一般都是转换字符串加密,如果你对循序有强迫要求,那就写一个key的排序,排序后再stringify,两端都同样处理就好了。
node.js code:
const _ = require('lodash');
const crypto = require('crypto');
// o:待加密对象,key:秘钥
function sign(o, key) {
let md5 = crypto.createHash('md5');
let s = _signString(o) + key;
return md5.update(s, 'utf8').digest('hex');
function _signString(params) {
let list = [];
_.each(params, (value, key) => {
let tuple = [key + '', value];
if (_.isObject(value) || _.isArray(value)) {
tuple[1] = _signString(value);
}
list.push(tuple);
});
// 过滤空值
list = _.filter(list, item => {
return item[1] || item[1] === false || item[1] === 0;
});
// 字典序
list = list.sort((x, y) => x[0].localeCompare(y[0]));
return _.map(list, item => item.join('=')).join('&');
}
}
手动拼接, 保证不会bug