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

本文介绍了一种对外接口参数验签的方法,重点解决了参数排序问题,确保了接口调用时参数的一致性和安全性。文章详细阐述了如何通过key对参数进行排序并生成统一的签名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口参数验签排序问题(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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值