package com.dsh.utils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.TreeMap;
/**
* @author 张鹏
* @date 2020/9/1 11:20
*
* 加密方法
*/
public class SignUtils {
/**
* 请求url的所有参数拼接成字符串
*
* @param map
* @return
*/
public static String createQueryString(Map map) {
if (map.isEmpty()) {
return null;
}
StringBuilder res = new StringBuilder();
for (String key : map.keySet()) {
String value = map.get(key);
if (null == key || "".equals(key)) {
continue;
}
try {
if (null != value && !"".equals(value)) {
res.append(key).append("=").append(URLEncoder.encode(value, "UTF-8")).append("&");
} else {
res.append(key).append("=").append(value).append("&");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
if (res.length() > 1) {
return res.substring(0, res.length() - 1);
}
return null;
}
/**
* 通过md5进行加密
*
* @param source 要加密的数据
* @return
* @throws NoSuchAlgorithmException
*/
private static String getMd5(String source) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] bytes = source.getBytes();
byte[] targetBytes = digest.digest(bytes);
char[] characters = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
StringBuilder builder = new StringBuilder();
for (byte b : targetBytes) {
int high = (b >> 4) & 15;
int low = b & 15;
char highChar = characters[high];
char lowChar = characters[low];
builder.append(highChar).append(lowChar);
}
return builder.toString();
}
/**
* 进行MD5加密
*
* @param qs
* @param time
* @param salt
* @return
*/
public static String getSign(String qs, long time, String salt) {
try {
return getMd5(String.format("%s&time=%d&salt=%s", qs, time, salt));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* 功能:将一个Map按照Key字母升序构成一个QueryString. 并且加入时间混淆的hash串
*
* @param queryMap query内容
* @param time 加密时候,为当前时间;解密时,为从querystring得到的时间;
* @param salt 加密salt
* @return
*/
public static String createHashedQueryString(Map queryMap, long time, String salt) {
Map map = new TreeMap(queryMap);
//生成queryString方法可自己编写
String qs = createQueryString(map);
if (qs == null) {
return null;
}
time = time / 1000;
String hash = getSign(qs, time, salt).toUpperCase();
String thqs = String.format("%s&time=%d&hash=%s", qs, time, hash);
return thqs;
}
// public static void main(String[] args) {
// // 需要传递的参数
// Map params = new HashMap();
// params.put("userid", "A00000000001");
// params.put("name", "测试直播");
// params.put("desc", "每晚八点");
// params.put("authtype", "1");
// params.put("publisherpass", "admin123");
// params.put("assistantpass", "admin123");
// params.put("templatetype", "5");
// params.put("playpass", "admin123");
// params.put("livestarttime", "2020-03-05 20:00:00");
//
// //秘钥
// String salt = "LASD8SD8SDN23K";
// //当前时间戳
// long time = System.currentTimeMillis();
// //生成http请求参数
// String str = createHashedQueryString(params, time, salt);
// System.out.println("加密后的字符串:" + str);
// }
}