/**
* 自定义生成Token令牌
* @author: Lu Yang
* @create: 2019-07-08 02:21
**/
public class TokenHelper {
private static volatile TokenHelper instance = null;
// Token 头部
private static final String TOKEN_HEADER = "eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ";
// 加密方案
private static final String ENCRYPTION_HMACSHA256 = "HMacSHA256";
// 编码格式
private static final String CODING_UTF8 = "UTF-8";
// mac算法
private Mac mac = null;
/**
* An external call initializes the instance method.
* 外部调用初始化实例方法.
* @author: Lu Yang
* @date: 2019/7/8 2:41
* @param
* @return com.luyang.framework.utils.token.TokenHelper
*/
public static TokenHelper getInstance () {
if (null == instance) {
synchronized (TokenHelper.class) {
if (null == instance) {
instance = new TokenHelper();
}
}
}
return instance;
}
/**
* Private structure, Initialization encryption.
* 私有构造,初始化mac加密.
* @author: Lu Yang
* @date: 2019/7/8 2:49
* @param
* @return
*/
private TokenHelper () {
/*
* byte[] bs = LU-YANG
* 使用异或 数据转换为二进制 位数比对 相同为1 否则 0
* 举例:
* 5482 ^ 5072 = 1001
* (2 ^ 1)= 0 * 10
*/
byte[] bs = {76, 85, (2 ^ 1) * 10, 89, 65, 78, 71};
// cs = Ø#
char[] cs = {'a' + 0167, 35 };
try {
// 实例化MAC 设置加密方式
mac = Mac.getInstance(ENCRYPTION_HMACSHA256);
final String secret = new String(bs, CODING_UTF8) + String.valueOf(cs);
// 对字符再次加密 产生密钥
SecretKeySpec key = new SecretKeySpec(secret.getBytes(), ENCRYPTION_HMACSHA256);
mac.init(key);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 生成Token
* @author: Lu Yang
* @date: 2019/7/8 3:01
* @param obj 用户信息对象 暂用Object代替
* @param duration token有效期时长 单位h
* @return java.lang.String
*/
public String generateToken (Object obj, int duration) {
// 解析用户对象信息
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(obj);
// 设置Token有效时长 单位s
jsonObject.put("exp", (new Date().getTime() / 1000) + duration * 60 * 60);
// 信息体
String claim = jsonObject.toJSONString();
// token 载体
String tokenPayload = null;
try {
tokenPayload = Base64.encodeBase64URLSafeString(claim.getBytes(CODING_UTF8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// mac 算法加密
byte[] buff = mac.doFinal((TOKEN_HEADER.concat(".") + tokenPayload).getBytes());
// Token 签名
String signature = Base64.encodeBase64URLSafeString(buff);
return TOKEN_HEADER.concat(".") + tokenPayload.concat(".") + signature;
}
/**
* 生成Token 默认过期时长为2天
* @author: Lu Yang
* @date: 2019/7/9 2:12
* @param obj
* @return java.lang.String
*/
public String generateToken (Object obj) {
return generateToken(obj, 48);
}
网友评论