声明:本文纯属个人随手笔记,如果对您有参考价值我十分开心,如果有存在错误,或者有更好的解决办法也麻烦您留言告诉我,大家共同成长,切勿恶言相。 欢迎加入资源共享QQ群:275343679,一起发现知识、了解知识、学习知识、分享知识。
个人网站:www.itlantian.top www.blueskyui.cn
================================================================================
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ObjectUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import com.common.rest.domain.MessageMetaInfo;
import com.common.utils.mapper.JsonMapper;
/**
* 消息中台接口调用token加密
*
* @version 1.0
* @rule token=appId:hmac-sha1(appSecret,urlsafe-base64(meta)):urlsafe-base64(meta)
* @date 2017年9月1日
*/
public class MessageTokenUtil {
private static Logger logger = LoggerFactory.getLogger(MessageTokenUtil.class);
private String appId;//APP唯一标识
private String appsecret;//密钥
private String meta;//为调⽤⽅提供的元数据,格式为json字符串。
private static final String MAC_NAME = "HmacSHA1";
private static final String ENCODING = "UTF-8";
public MessageTokenUtil(String appId, String appsecret, MessageMetaInfo messageMetaInfo) {
super();
this.appId = appId;
this.appsecret = appsecret;
messageMetaInfo.setIp(getLocalIP());//服务器IP
messageMetaInfo.setDeadline(System.currentTimeMillis() / 1000 + 3600);//utc时间,为调⽤接⼝时间+3600秒
this.meta = ObjectUtils.isEmpty(messageMetaInfo) ? null : JsonMapper.toJsonString(messageMetaInfo);
}
/**
* 使用 HMAC-SHA1 签名方法对对encryptText进行签名
*
* @param encryptText 被签名的字符串
* @param encryptKey 密钥
* @return 返回被加密后的字符串
* @throws Exception
*/
public static String HmacSHA1Encrypt(String encryptKey, String encryptText) throws Exception {
byte[] data = encryptKey.getBytes(ENCODING);
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
// 生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance(MAC_NAME);
// 用给定密钥初始化 Mac 对象
mac.init(secretKey);
byte[] text = encryptText.getBytes(ENCODING);
// 完成 Mac 操作
byte[] digest = mac.doFinal(text);
StringBuilder sBuilder = bytesToHexString(digest);
return sBuilder.toString();
}
/**
* 转换成Hex
*
* @param bytesArray
*/
public static StringBuilder bytesToHexString(byte[] bytesArray) {
if (bytesArray == null) {
return null;
}
StringBuilder sBuilder = new StringBuilder();
for (byte b : bytesArray) {
String hv = String.format("%02x", b);
sBuilder.append(hv);
}
return sBuilder;
}
//safeUrlBase64Encode加密
public static String safeUrlBase64Encode(String data) {
return safeUrlBase64Encode(data.getBytes());
}
public static String safeUrlBase64Encode(byte[] data) {
String encodeBase64 = new BASE64Encoder().encode(data);
String safeBase64Str = encodeBase64.replace('+', '-');
safeBase64Str = safeBase64Str.replace('/', '_');
safeBase64Str = safeBase64Str.replaceAll("=", "");
return safeBase64Str;
}
//safeUrlBase64Encode解密
public static byte[] safeUrlBase64Decode(final String safeBase64Str) throws IOException {
String base64Str = safeBase64Str.replace('-', '+');
base64Str = base64Str.replace('_', '/');
int mod4 = base64Str.length() % 4;
if (mod4 > 0) {
base64Str = base64Str + "====".substring(mod4);
}
return new BASE64Decoder().decodeBuffer(base64Str);
}
//urlsafe_base64 加密
public static String encoded(String data) throws UnsupportedEncodingException {
byte[] b = Base64.encodeBase64URLSafe(data.getBytes(ENCODING));
return new String(b, ENCODING);
}
//urlsafe_base64 解密
public static String decode(String data) throws UnsupportedEncodingException {
byte[] b = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(b, ENCODING);
}
/**
* 获取加密token
*
* @return
*/
public String getToken() {
//appId:hmac-sha1(appSecret,urlsafe-base64(meta)):urlsafe-base64(meta)
try {
logger.info(String.format("getToken request param:%s", meta));
String urlsafe_base64_str = safeUrlBase64Encode(meta);
String hmac_sha1_str = HmacSHA1Encrypt(appsecret, urlsafe_base64_str);
String toekn = appId + ":" + hmac_sha1_str + ":" + urlsafe_base64_str;
return toekn;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 获取本机ip地址,并自动区分Windows还是linux操作系统
*
* @return String
*/
public static String getLocalIP() {
String sIP = "";
InetAddress ip = null;
try {
//如果是Windows操作系统
if (isWindowsOS()) {
ip = InetAddress.getLocalHost();
} else {
//如果是Linux操作系统
boolean bFindIP = false;
Enumeration<NetworkInterface> netInterfaces = (Enumeration<NetworkInterface>) NetworkInterface
.getNetworkInterfaces();
while (netInterfaces.hasMoreElements()) {
if (bFindIP) {
break;
}
NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
//----------特定情况,可以考虑用ni.getName判断
//遍历所有ip
Enumeration<InetAddress> ips = ni.getInetAddresses();
while (ips.hasMoreElements()) {
ip = (InetAddress) ips.nextElement();
if (ip.isSiteLocalAddress()
&& !ip.isLoopbackAddress() //127.开头的都是lookback地址
&& ip.getHostAddress().indexOf(":") == -1) {
bFindIP = true;
break;
}
}
}
}
} catch (Exception e) {
logger.error("get ip error.", e);
}
if (null != ip) {
sIP = ip.getHostAddress();
}
logger.debug("==========ip:" + sIP);
return sIP;
}
/**
* 判断系统
*
* @return String
*/
public static boolean isWindowsOS() {
boolean isWindowsOS = false;
String osName = System.getProperty("os.name");
if (osName.toLowerCase().indexOf("windows") > -1) {
isWindowsOS = true;
}
return isWindowsOS;
}
public static void main(String[] args) {
try {
MessageMetaInfo mmi = new MessageMetaInfo();
mmi.setIp("10.200.0.1");
mmi.setModel("test");
mmi.setDeadline(12345678);
mmi.setEmail("238236@qq.com");
mmi.setDesc("desc");
MessageTokenUtil mtu = new MessageTokenUtil("zdqghwlsvsaqposee", "ulaotbgnsbiunysny", mmi);
System.out.println(mtu.getToken() + "**" + (System.currentTimeMillis() / 1000 + 3600));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}