package cn.efunbox.audio.utils; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; import org.apache.commons.lang.StringUtils; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; /** * 常見的几种加密方式 */ @Slf4j public class Encrypt { public static final String SIGN = "sign"; public static String createSHA256Sign(Map paramMap, String signKey) { List sortedKeys = new ArrayList(); for (Map.Entry entry : paramMap.entrySet()) { if (SIGN.equals(entry.getKey())) { continue; } sortedKeys.add(entry.getKey()); } if (sortedKeys.size() == 0) { // 没有参数 return ""; } Collections.sort(sortedKeys); StringBuffer buff = new StringBuffer(""); for (String key : sortedKeys) { String val = paramMap.get(key); if (StringUtils.isBlank(val)) { continue; } buff.append(key).append("=").append(val).append("&"); } buff.append("key=").append(signKey); try { return Encrypt.String2SHA256(buff.toString()); } catch (Exception e) { throw new RuntimeException("签名错误"); } } /** * 利用Apache的工具类实现SHA-256加密 * @param str 加密后的报文 * @return */ public static String String2SHA256(String str){ MessageDigest messageDigest; String encdeStr = ""; try { messageDigest = MessageDigest.getInstance("SHA-256"); byte[] hash = messageDigest.digest(str.getBytes("UTF-8")); encdeStr = Hex.encodeHexString(hash); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return encdeStr; } //--------- /** * 利用java原生的摘要实现SHA256加密 * @param str 加密后的报文 * @return */ public static String String2SHA256StrJava(String str){ MessageDigest messageDigest; String encodeStr = ""; try { messageDigest = MessageDigest.getInstance("SHA-256"); messageDigest.update(str.getBytes("UTF-8")); encodeStr = byte2Hex(messageDigest.digest()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return encodeStr; } /** * 将byte转为16进制 * @param bytes * @return */ private static String byte2Hex(byte[] bytes){ StringBuffer stringBuffer = new StringBuffer(); String temp = null; for (int i=0;i paramMap, String signKey) { List sortedKeys = new ArrayList<>(); for (Map.Entry entry : paramMap.entrySet()) { if (SIGN.equals(entry.getKey())) { continue; } sortedKeys.add(entry.getKey()); } if (sortedKeys.size() == 0) { // 没有参数 return ""; } Collections.sort(sortedKeys); StringBuffer buff = new StringBuffer(""); for (String key : sortedKeys) { String val = paramMap.get(key); if (StringUtils.isBlank(val)) { continue; } buff.append(key).append("=").append(val).append("&"); } buff.deleteCharAt(buff.length() - 1); try { return HMACSHA256(buff.toString(),signKey); } catch (Exception e) { throw new RuntimeException("签名错误"); } } public static String HMACSHA256(String data, String key) throws Exception { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"); sha256_HMAC.init(secret_key); byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte item : array) { sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); } return sb.toString().toUpperCase(); } public static void main(String[] args) { Map param = new HashMap<>(); param.put("idChannel","1000"); param.put("idDevice","test"); param.put("ts",System.currentTimeMillis() / 1000 + ""); System.out.println(JSONObject.toJSONString(param)); // String sign = Encrypt.createHMACSHA256(param,"IhOTiTyMLDNNLFuP"); String sign = Encrypt.createHMACSHA256(param,"AzaSB2RR0boUz1WQ"); log.info(sign); String encode = Base64.getEncoder().encodeToString(sign.getBytes(StandardCharsets.UTF_8)); log.info(encode); String decode = new String(Base64.getDecoder().decode(encode), StandardCharsets.UTF_8); log.info(decode); } }