4890d92700da514d1f486c79592fed7cd1023420.svn-base 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package cn.com.goldenwater.dcproj.utils.gwxy;
  2. import org.apache.commons.codec.binary.Base64;
  3. import org.apache.commons.codec.digest.DigestUtils;
  4. import javax.crypto.Mac;
  5. import javax.crypto.spec.SecretKeySpec;
  6. import java.io.UnsupportedEncodingException;
  7. import java.net.URLEncoder;
  8. import java.security.SignatureException;
  9. import java.util.*;
  10. public class MeetUtil {
  11. protected static String computeStringToSign(String requestPath, Map<String, String> reqParams, String reqJsonEntity, String reqMethod, String requestUriPrefix) throws Exception {
  12. //1. request method
  13. StringBuffer strToSign = new StringBuffer(reqMethod);
  14. strToSign.append("\n");
  15. //2. request path
  16. strToSign.append(requestPath.substring(requestUriPrefix.length()));
  17. strToSign.append("\n");
  18. //3. sorted request param and value
  19. List<String> params = new ArrayList<>(reqParams.keySet());
  20. Collections.sort(params);
  21. for (String param : params) {
  22. strToSign.append(param);
  23. strToSign.append("=");
  24. try {
  25. strToSign.append(URLEncoder.encode(reqParams.get(param), "UTF-8"));
  26. } catch (UnsupportedEncodingException e) {
  27. }
  28. strToSign.append("&");
  29. }
  30. strToSign.deleteCharAt(strToSign.length() - 1);
  31. strToSign.append("\n");
  32. //4. request entity
  33. byte[] reqEntity = reqJsonEntity.getBytes("utf-8");
  34. if (reqEntity.length == 0) {
  35. byte[] entity = DigestUtils.sha256("");
  36. strToSign.append(Base64.encodeBase64String(entity));
  37. } else {
  38. byte[] data = null;
  39. if (reqEntity.length <= 100) {
  40. data = reqEntity;
  41. } else {
  42. data = Arrays.copyOf(reqEntity, 100);
  43. }
  44. byte[] entity = DigestUtils.sha256(data);
  45. strToSign.append(Base64.encodeBase64String(entity));
  46. }
  47. String ret = strToSign.toString();
  48. System.out.println(ret);
  49. System.out.println("------------------");
  50. return ret;
  51. }
  52. private static String calculateHMAC(String data, String key) throws SignatureException {
  53. try {
  54. SecretKeySpec e = new SecretKeySpec(key.getBytes("UTF8"), "HmacSHA256");
  55. Mac mac = Mac.getInstance("HmacSHA256");
  56. mac.init(e);
  57. byte[] rawHmac = mac.doFinal(data.getBytes("UTF8"));
  58. String result = Base64.encodeBase64String(rawHmac);
  59. return result;
  60. } catch (Exception var6) {
  61. throw new SignatureException("Failed to generate HMAC : " + var6.getMessage());
  62. }
  63. }
  64. /**
  65. * 根据参数获取 请求签名
  66. *
  67. * @param jsonEntity json 参数对象
  68. * @param method 请求方式
  69. * @param token 企业token
  70. * @param reqPath 请求地址
  71. * @param requestUriPrefix 请求前缀
  72. * @return 签名
  73. */
  74. public static String computeSignature(String jsonEntity, String method, String token, String reqPath, String requestUriPrefix) {
  75. try {
  76. Map<String, String> reqParams = new HashMap<>();
  77. int idx = reqPath.indexOf("?");
  78. String[] params = reqPath.substring(idx + 1).split("&");
  79. for (String param : params) {
  80. String[] pair = param.split("=");
  81. reqParams.put(pair[0], pair[1]);
  82. }
  83. reqPath = reqPath.substring(0, idx);
  84. String strToSign = computeStringToSign(reqPath, reqParams, jsonEntity, method, requestUriPrefix);
  85. String mySignature = calculateHMAC(strToSign, token);
  86. mySignature = mySignature.replace(" ", "+");
  87. return URLEncoder.encode(mySignature, "utf-8");
  88. } catch (Exception e) {
  89. return null;
  90. }
  91. }
  92. }