md5加密的问题,求帮助
发布于 6 年前 作者 chelsh 3084 次浏览 来自 问答

类似这样的数据:

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加密方法呢?

5 回复

把整个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

回到顶部