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