e285bcc5b38c8bd3cc6c08cb390427baad2e905d.svn-base 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package cn.com.goldenwater.dcproj.service.impl.system;
  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 SignatureSampleTest {
  11. private String requestUriPrefix = "https://cloud.xylink.com/api/rest/external/v1/";
  12. protected String computeStringToSign(String requestPath, Map<String, String> reqParams, String reqJsonEntity, String reqMethod) throws Exception {
  13. //1. request method
  14. StringBuffer strToSign = new StringBuffer(reqMethod);
  15. strToSign.append("\n");
  16. //2. request path
  17. strToSign.append(requestPath.substring(requestUriPrefix.length()));
  18. strToSign.append("\n");
  19. //3. sorted request param and value
  20. List<String> params = new ArrayList<>(reqParams.keySet());
  21. Collections.sort(params);
  22. for (String param : params) {
  23. strToSign.append(param);
  24. strToSign.append("=");
  25. try {
  26. strToSign.append(URLEncoder.encode(reqParams.get(param), "UTF-8"));
  27. } catch (UnsupportedEncodingException e) {
  28. }
  29. strToSign.append("&");
  30. }
  31. strToSign.deleteCharAt(strToSign.length() - 1);
  32. strToSign.append("\n");
  33. //4. request entity
  34. byte[] reqEntity = reqJsonEntity.getBytes("utf-8");
  35. if (reqEntity.length == 0) {
  36. byte[] entity = DigestUtils.sha256("");
  37. strToSign.append(Base64.encodeBase64String(entity));
  38. } else {
  39. byte[] data = null;
  40. if (reqEntity.length <= 100) {
  41. data = reqEntity;
  42. } else {
  43. data = Arrays.copyOf(reqEntity, 100);
  44. }
  45. byte[] entity = DigestUtils.sha256(data);
  46. strToSign.append(Base64.encodeBase64String(entity));
  47. }
  48. String ret = strToSign.toString();
  49. System.out.println(ret);
  50. System.out.println("------------------");
  51. return ret;
  52. }
  53. private String calculateHMAC(String data, String key) throws SignatureException {
  54. try {
  55. SecretKeySpec e = new SecretKeySpec(key.getBytes("UTF8"), "HmacSHA256");
  56. Mac mac = Mac.getInstance("HmacSHA256");
  57. mac.init(e);
  58. byte[] rawHmac = mac.doFinal(data.getBytes("UTF8"));
  59. String result = Base64.encodeBase64String(rawHmac);
  60. return result;
  61. } catch (Exception var6) {
  62. throw new SignatureException("Failed to generate HMAC : " + var6.getMessage());
  63. }
  64. }
  65. public String computeSignature(String jsonEntity, String method, String token, String reqPath) {
  66. try {
  67. Map<String, String> reqParams = new HashMap<>();
  68. int idx = reqPath.indexOf("?");
  69. String[] params = reqPath.substring(idx + 1).split("&");
  70. for (String param : params) {
  71. String[] pair = param.split("=");
  72. reqParams.put(pair[0], pair[1]);
  73. }
  74. reqPath = reqPath.substring(0, idx);
  75. String strToSign = computeStringToSign(reqPath, reqParams, jsonEntity, method);
  76. String mySignature = calculateHMAC(strToSign, token);
  77. mySignature = mySignature.replace(" ", "+");
  78. return URLEncoder.encode(mySignature, "utf-8");
  79. } catch (Exception e) {
  80. return null;
  81. }
  82. }
  83. }