Java - 外部接口MD5验签

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * 对外接口服务
 */
@RestController
@RequestMapping("/external")
public class ExternalController {

  /**
     * MD5密钥(这里写入自己的密钥)
     */
    private static final String KEY = "************";

    /**
     * @描述 外部调用接口时传入的数据安全验证
     * @参数 [body]:data存放入参数据,encStr存放加密串,dateTime 存放时间戳
     */
    public void validation(JSONObject body) {
        String encStr = body.getString("encStr");
        JSONObject data = body.getJSONObject("data");
        Long dateTime = body.getLong("dateTime");
        String str = "key:" + KEY + ",data:" + JSON.toJSONString(data) + ",date:" + dateTime;
        String md5 = DigestUtils.md5DigestAsHex(str.getBytes());
        if (!StringUtils.equals(md5, encStr)) {
            throw new RuntimeException("令牌错误,无调用权限");
        }
    }

    /**
     * @描述 外部接口调用入参规则示例
     */
    public static void main(String[] args) {
        JSONObject body = new JSONObject();
        JSONObject data = new JSONObject();
        //约定传入参数
        data.put("type", 1);
        data.put("key1", "*******");
        data.put("key2", "*******");
        //添加时间后,实时变更密钥串,防止获取固定密钥串
        Date date = new Date();
        long dateTime = date.getTime();
        //加密方式,内置参数请勿挪动位置,否则验证失败
        String str = "key:" + KEY + ",data:" + JSON.toJSONString(data) + ",date:" + dateTime;
        //MD5加密
        String md5 = DigestUtils.md5DigestAsHex(str.getBytes());
        body.put("data", data);
        body.put("encStr", md5);
        body.put("dateTime", dateTime);
        //打印出最终传参,方便复制
        System.out.println(JSON.toJSONString(body));
    }

    /**
     * @描述 这里举例(假设该接口为外部接口,调用内部接口 validation方法)
     * @参数 []
     * @返回值 void
     */
    @GetMapping("/callValidation")
    public void callValidation() {
        JSONObject body = new JSONObject();
        JSONObject data = new JSONObject();
        //约定传入参数
        data.put("type", 1);
        data.put("key1", "*******");
        data.put("key2", "*******");
        //添加时间后,实时变更密钥串,防止获取固定密钥串
        Date date = new Date();
        long dateTime = date.getTime();
        //加密方式,内置参数请勿挪动位置,否则验证失败
        String str = "key:" + KEY + ",data:" + JSON.toJSONString(data) + ",date:" + dateTime;
        //MD5加密
        String md5 = DigestUtils.md5DigestAsHex(str.getBytes());
        body.put("data", data);
        body.put("encStr", md5);
        body.put("dateTime", dateTime);
        //调用接口,此处主要是演示,外部调用时可以使用client通过http方式调用
        validation(body);
    }
}

你可能感兴趣的:(Java - 外部接口MD5验签)