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
|
* <p>
|
* 加密方法
|
*/
|
public class SignUtils {
|
|
/**
|
* 请求url的所有参数拼接成字符串
|
*
|
* @param map
|
* @return
|
*/
|
public static String createQueryString(Map<String, String> 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<String, String> queryMap, long time, String salt) {
|
Map<String, String> map = new TreeMap<String, String>(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<String, String> params = new HashMap<String, String>();
|
// 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);
|
// }
|
}
|