Java 外部接口MD5验签

引言

  • 最近翻看之前写的MD5加密、验签,发现有一些不足,所以对其进行了一些优化,增加了验签失效时间规则
  • 优化前的文章在简书中未作修改,感兴趣的朋友可以到 简书中查看。

示例

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

import java.util.Date;

/**
 * MD5加密、验签
 */
@RestController
public class ExternalController {

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

    /**
     * 签名验证时间(TIMES =分钟 * 秒 * 毫秒)
     * 当前设置为:5分钟有效期
     */
    protected static final Integer TIMES = 5 * 60 * 1000;

    /**
     * @描述 验签
     */
    public static void validation(JSONObject body) {
        //获取MD5加密串
        String sign = body.getString("sign");
        //加密串更改为密钥:key
        body.put("sign", KEY);
        //加密验证
        String md5 = DigestUtils.md5DigestAsHex(JSON.toJSONString(body).getBytes());
        if (!StringUtils.equals(md5, sign)) {
            throw new RuntimeException("验签错误");
        }
        //当前时间 - 传入时间 > TIMES 则认为超出有效时间
        long thisTime = System.currentTimeMillis() - body.getLong("dateTime");
        if (thisTime > TIMES) {
            throw new RuntimeException("该验签已失效");
        }
    }

    /**
     * @描述 加密
     */
    public static void main(String[] args) {
        //传入参数
        JSONObject data = new JSONObject();
        data.put("type", "type");
        data.put("key1", "key1");
        data.put("key2", "key2");
        //添加时间后,实时变更密钥串,防止获取固定密钥串
        long dateTime = new Date().getTime();
        //根据密钥、数据、时间进行加密
        JSONObject body = new JSONObject();
        body.put("sign", KEY);
        body.put("data", data);
        body.put("dateTime", dateTime);
        //MD5加密
        String md5 = DigestUtils.md5DigestAsHex(JSON.toJSONString(body).getBytes());
        //修改密钥为数据加密后加密串
        body.put("sign", md5);
        //验签测试
        validation(body);
    }
}

你可能感兴趣的:(Java,随手记,java)