/**
* 自定义生成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);
}
基于mac自定义生成Token令牌
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1、设定token存储格式为json 对象参数包含自定义的秘钥secretKey,从登录人信息中获取的userId...
- Mac中如何安装PHP7,为什么brew安装php7为什么找不到.so文件呢,安装php7后丢失libphp7.s...
- token 我的理解是一种凭证,客户端请求时携带此凭证才能有效访问需要验证凭证的服务端接口,而且token可以加密...
- 1.使用admin账户登录sonar平台 2.进入配置页面的权限模块 3.强制用户认证选项勾选(英文选项为:For...