Encrypt.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package cn.efunbox.audio.utils;
  2. import com.alibaba.fastjson.JSONObject;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.commons.codec.binary.Hex;
  5. import org.apache.commons.lang.StringUtils;
  6. import javax.crypto.Mac;
  7. import javax.crypto.spec.SecretKeySpec;
  8. import java.io.UnsupportedEncodingException;
  9. import java.nio.charset.StandardCharsets;
  10. import java.security.MessageDigest;
  11. import java.security.NoSuchAlgorithmException;
  12. import java.util.*;
  13. /**
  14. * 常見的几种加密方式
  15. */
  16. @Slf4j
  17. public class Encrypt {
  18. public static final String SIGN = "sign";
  19. public static String createSHA256Sign(Map<String, String> paramMap, String signKey) {
  20. List<String> sortedKeys = new ArrayList<String>();
  21. for (Map.Entry<String, String> entry : paramMap.entrySet()) {
  22. if (SIGN.equals(entry.getKey())) {
  23. continue;
  24. }
  25. sortedKeys.add(entry.getKey());
  26. }
  27. if (sortedKeys.size() == 0) {
  28. // 没有参数
  29. return "";
  30. }
  31. Collections.sort(sortedKeys);
  32. StringBuffer buff = new StringBuffer("");
  33. for (String key : sortedKeys) {
  34. String val = paramMap.get(key);
  35. if (StringUtils.isBlank(val)) {
  36. continue;
  37. }
  38. buff.append(key).append("=").append(val).append("&");
  39. }
  40. buff.append("key=").append(signKey);
  41. try {
  42. return Encrypt.String2SHA256(buff.toString());
  43. } catch (Exception e) {
  44. throw new RuntimeException("签名错误");
  45. }
  46. }
  47. /**
  48. * 利用Apache的工具类实现SHA-256加密
  49. * @param str 加密后的报文
  50. * @return
  51. */
  52. public static String String2SHA256(String str){
  53. MessageDigest messageDigest;
  54. String encdeStr = "";
  55. try {
  56. messageDigest = MessageDigest.getInstance("SHA-256");
  57. byte[] hash = messageDigest.digest(str.getBytes("UTF-8"));
  58. encdeStr = Hex.encodeHexString(hash);
  59. } catch (NoSuchAlgorithmException e) {
  60. e.printStackTrace();
  61. } catch (UnsupportedEncodingException e) {
  62. e.printStackTrace();
  63. }
  64. return encdeStr;
  65. }
  66. //---------
  67. /**
  68. * 利用java原生的摘要实现SHA256加密
  69. * @param str 加密后的报文
  70. * @return
  71. */
  72. public static String String2SHA256StrJava(String str){
  73. MessageDigest messageDigest;
  74. String encodeStr = "";
  75. try {
  76. messageDigest = MessageDigest.getInstance("SHA-256");
  77. messageDigest.update(str.getBytes("UTF-8"));
  78. encodeStr = byte2Hex(messageDigest.digest());
  79. } catch (NoSuchAlgorithmException e) {
  80. e.printStackTrace();
  81. } catch (UnsupportedEncodingException e) {
  82. e.printStackTrace();
  83. }
  84. return encodeStr;
  85. }
  86. /**
  87. * 将byte转为16进制
  88. * @param bytes
  89. * @return
  90. */
  91. private static String byte2Hex(byte[] bytes){
  92. StringBuffer stringBuffer = new StringBuffer();
  93. String temp = null;
  94. for (int i=0;i<bytes.length;i++){
  95. temp = Integer.toHexString(bytes[i] & 0xFF);
  96. if (temp.length()==1){
  97. //1得到一位的进行补0操作
  98. stringBuffer.append("0");
  99. }
  100. stringBuffer.append(temp);
  101. }
  102. return stringBuffer.toString();
  103. }
  104. public static String createHMACSHA256(Map<String, String> paramMap, String signKey) {
  105. List<String> sortedKeys = new ArrayList<>();
  106. for (Map.Entry<String, String> entry : paramMap.entrySet()) {
  107. if (SIGN.equals(entry.getKey())) {
  108. continue;
  109. }
  110. sortedKeys.add(entry.getKey());
  111. }
  112. if (sortedKeys.size() == 0) {
  113. // 没有参数
  114. return "";
  115. }
  116. Collections.sort(sortedKeys);
  117. StringBuffer buff = new StringBuffer("");
  118. for (String key : sortedKeys) {
  119. String val = paramMap.get(key);
  120. if (StringUtils.isBlank(val)) {
  121. continue;
  122. }
  123. buff.append(key).append("=").append(val).append("&");
  124. }
  125. buff.deleteCharAt(buff.length() - 1);
  126. try {
  127. return HMACSHA256(buff.toString(),signKey);
  128. } catch (Exception e) {
  129. throw new RuntimeException("签名错误");
  130. }
  131. }
  132. public static String HMACSHA256(String data, String key) throws Exception {
  133. Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
  134. SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
  135. sha256_HMAC.init(secret_key);
  136. byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
  137. StringBuilder sb = new StringBuilder();
  138. for (byte item : array) {
  139. sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
  140. }
  141. return sb.toString().toUpperCase();
  142. }
  143. public static void main(String[] args) {
  144. Map<String,String> param = new HashMap<>();
  145. param.put("idChannel","1000");
  146. param.put("idDevice","test");
  147. param.put("ts",System.currentTimeMillis() / 1000 + "");
  148. System.out.println(JSONObject.toJSONString(param));
  149. // String sign = Encrypt.createHMACSHA256(param,"IhOTiTyMLDNNLFuP");
  150. String sign = Encrypt.createHMACSHA256(param,"AzaSB2RR0boUz1WQ");
  151. log.info(sign);
  152. String encode = Base64.getEncoder().encodeToString(sign.getBytes(StandardCharsets.UTF_8));
  153. log.info(encode);
  154. String decode = new String(Base64.getDecoder().decode(encode), StandardCharsets.UTF_8);
  155. log.info(decode);
  156. }
  157. }