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); // } }