接口鉴权分两部分
1. token为时间戳[但要求为80-120分钟之前时间范围内的一个时间戳],默认设定为90分钟前,则token有效期为30分钟,服务端判断时间戳的有效范围;范围可自定义
- token 类型Long 提取当前时间90分钟前时刻的时间戳
- sign 类型 String 时间戳token进行md5后,取前8位
2. 签名sign,对token值进行md5(可加盐),然后提取md5后字符串的前8位(规则可自定义)
有效URL生成之后,通常有一个有效期,默认设置为30分钟;此方法简单粗暴有效,土鳖算法,普通的小项目合作足够满足。
package com.learnworm.common.tools;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Calendar;
import java.util.Date;
/**
* @Author :learnworm
* @Desc : Md5工具类
* @Date : 2021-12-14 10:55
**/
public class Md5Tool {
private static final int DEFAULT_EXPIRE_TIME = 90;
private static final int DEFAULT_EXPIRE_TIMEOUT = 30;
/**
* java原生MD5加密算法
* @param plainText
* @return
*/
public String md5s(String plainText) {
String str = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
str = buf.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return str;
}
/**
* @desc: 自创土鳖时间戳验证算法
* @param min
* @return
* Date
*/
public Long createTimestamp(int min) {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.MINUTE, -min);
return c.getTime().getTime();
}
/**
* @desc 生成签名串
* @return
*/
public String createSign(){
Long timestamp = createTimestamp(DEFAULT_EXPIRE_TIME);
return md5s(timestamp.toString()).substring(0,8);
}
/**
* @desc 生成签名串
* @return
*/
public String createSign(Long timestamp){
if (timestamp==null){
timestamp = createTimestamp(DEFAULT_EXPIRE_TIME);
}
return md5s(timestamp.toString()).substring(0,8);
}
/**
* 时间差-分钟
* @desc: getMinutesDiff
* @param stopDate
* @param startDate
* @return
* int
*/
public int getMinutesDiff(Date stopDate, Long startDate) {
long t2 = stopDate.getTime();
long t1 = startDate;
int diff = (int) ((t2 - t1) / 60000L);
diff += (t2 > t1 + diff * 60000L ? 1 : 0);
return diff;
}
/**
* @校验是否有效
* @param timestamp
* @return
*/
public boolean checkToken(Long timestamp){
boolean isValid = false;
Date date = new Date();
int diff = getMinutesDiff(date,timestamp);
System.out.println(timestamp+"===checkToken===="+diff);
if (diff>DEFAULT_EXPIRE_TIME-10 && diff < DEFAULT_EXPIRE_TIME+DEFAULT_EXPIRE_TIMEOUT){
isValid = true;
}
System.out.println(isValid);
return isValid;
}
/**
* @校验是否有效
* @param timestamp
* @return
*/
public boolean checkSign(Long timestamp,String sign){
boolean isValid = false;
String calcSign = createSign(timestamp);
if (calcSign.equals(sign)){
isValid = true;
}
System.out.println(calcSign+"===checkSign====="+sign+"====="+isValid);
return isValid;
}
public static void main(String agrs[]) {
Md5Tool md51 = new Md5Tool();
int point = 90;
String sign = null;
Long token = null;
token = md51.createTimestamp(point);
sign = md51.md5s(token.toString());
System.out.println(token+"========"+sign.substring(0,8));
}
}