背景:支付项目中如何防止数据被篡改?可以使用验证签名功能,如果返回false,说明数据被篡改,不应该执行后面的功能。验证签名功能也可以应用在微服务项目中,放在网关中做拦截过滤请求参数…
1.maven中引入
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
2.项目引入SignUtil工具类
package com.test.sign;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 参数验证签名工具类
*/
public class SignUtil {
private static Logger logger = LoggerFactory.getLogger(SignUtil.class);
/** 加密密钥 */
private final static String APP_KEY = "mykey123456";
public final static String SECRET_KEY = "mysecret123456";
/** 字符编码 */
private final static String INPUT_CHARSET = "UTF-8";
/** 超时时间 */
private final static int TIME_OUT = 30 * 60 * 1000;
/**
* 请求参数Map转换验证Map
*
* @param requestParams
* 请求参数Map
* @param charset
* 是否要转utf8编码
* @return
* @throws UnsupportedEncodingException
*/
public static Map<String, String> toVerifyMap(Map<String, String[]> requestParams, boolean charset) {
Map<String, String> params = new HashMap<>();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length -