接口参数验签排序问题(map类型,通过key排序)

接口参数验签排序问题(map类型,通过key排序)


在设计对外的接口中,为了参数的安全性,经常会进行参数加密验签,以保证所传参数俩边一致,但是在生成签名时,如果参数的顺序不一致就会导致生成的签名不同,从而验签失败,因此参数排序成了重中之重。
public static String sign(Map<String, Object> data, String key) {
        if (data == null || data.isEmpty()) {
            return null;
        }
        StringBuilder buf = new StringBuilder();
        //接口在接收参数时返回的类型为LinkedHashMap,所以先转换为hashmap
        Map hashMap = JSONObject.parseObject(JSONObject.toJSONString(data), Map.class);
        //因为会存在map中嵌套map 的情况,使用SerializerFeature.MapSortField可以将所有参数排序通过key进行排序,再使用Feature.OrderedField保证转map时顺序正确
        LinkedHashMap<String, Object> map = JSON.parseObject(JSON.toJSONString(hashMap, SerializerFeature.MapSortField),LinkedHashMap.class, Feature.OrderedField);
        Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, Object> entry = it.next();
            Object k = entry.getKey();
            if ("class".equals(k) || "key".equals(k) || "sign".equals(k)) {
                continue;
            }
            Object v = entry.getValue(); //  非空
            if (v == null || "".equals(v.toString())) {
                continue;
            }
            buf.append(k);
            buf.append("=");
            buf.append(v);
            buf.append("&");
        }
        buf.append("key=" + key);
        log.info(buf.toString());
		//生成签名
        String sign = EncryptUtil.md5(buf.toString()).toUpperCase();
        return sign;
    }

版权声明:本文为weixin_42608402原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。