java参数签名实现

最近公司有个参数签名的需求,大致流程是前端把token,时间戳,还有body通过md5算法计算一个sign值,并且把token,时间戳,sign放在请求的头部,后端接收请求的时候,把token,时间戳,还有body重新用md5算法计算一次,这一次计算出的sign跟前端传过来的sign进行匹配,如果匹配成功,说明参数在网络传输的过程没有被篡改,匹配不成功,则参数在网络传输的过程中有被篡改,则拒绝请求

前端计算sign的js代码如下(md5算法是用CryptoJS框架实现的):

var timestamp= new Date().getTime(); //生成一个毫秒时间戳
var token=pm.request.headers.get("token"); //获取请求头部token参数
var body=pm.request.body.raw; //获取请求body体参数
var sign = CryptoJS.MD5(CryptoJS.MD5(token).toString().toUpperCase() + timestamp + body ).toString().toUpperCase(); //签名算法生产签名

 postmam中调用请求头部如下:

 后端代码如下(md5算法是用spring自带的):

import org.springframework.http.HttpMethod;
import org.springframework.util.DigestUtils;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;

public class Md5Sign {

    public static String md5Encrypt(HttpServletRequest request){
        String token = request.getHeader("token");
        String timestamp = request.getHeader("timestamp");

        String body = "";
        String requestMethod = request.getMethod();
        if(HttpMethod.POST.name().equals(requestMethod)){
            body = getPostData(request);
        }else if(HttpMethod.GET.name().equals(requestMethod)){
            body = getGetData(request);
        }
        String tokenMd5 = DigestUtils.md5DigestAsHex(token.getBytes());
        StringBuilder sb = new StringBuilder();
        sb.append(tokenMd5.toUpperCase()).append(timestamp).append(body);
        String md502 = DigestUtils.md5DigestAsHex(sb.toString().getBytes());
        return md502.toUpperCase();

    }
    public static boolean paramIsDistort (HttpServletRequest request){
        String sign = request.getHeader("sign");

        if(sign.equals(md5Encrypt(request))){
            return true;
        }
        return false;
    }

    public static String getPostData(HttpServletRequest request) {
        StringBuffer data = new StringBuffer();
        String line = null;
        BufferedReader reader = null;
        try {
            reader = request.getReader();
            while (null != (line = reader.readLine()))
                data.append(line);
        } catch (IOException e) {
        } finally {
        }
        return data.toString();
    }

    public static String getGetData(HttpServletRequest request) {
        String par = request.getQueryString() ;
        return par == null?"":par;
    }
}

后端调用Md5Sign.paramIsDistort(httpRequest)来验证post请求/get请求 中的参数是否被篡改

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值