ServerController.java 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package com.huimv.management.rsa;
  2. import java.io.UnsupportedEncodingException;
  3. import java.net.URLDecoder;
  4. import java.nio.charset.StandardCharsets;
  5. import java.security.InvalidKeyException;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.security.SignatureException;
  8. import java.security.spec.InvalidKeySpecException;
  9. import java.util.Comparator;
  10. import java.util.Map;
  11. import com.huimv.common.utils.Constant;
  12. import org.springframework.web.bind.annotation.PostMapping;
  13. import org.springframework.web.bind.annotation.RequestBody;
  14. import org.springframework.web.bind.annotation.RestController;
  15. @RestController
  16. public class ServerController {
  17. // 公钥
  18. // private final static String PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJz1kfGpz7dGFZCUY/kXbvYBXZEd5Xg+S8SRRD+p2iGCeQlKJ+Fycuboe7hIr8jhyTEKpaOFN8wW5/QNXdOzDnMCAwEAAQ==";
  19. private final static String PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIvJs0JQAJJZ9VYKyo69ByDYzDpCTjyu/bUcw+7SI1PqZtliUYmjUmaQdzKigCjpQH2Sq3x+VSmfnprZhP6COYkCAwEAAQ==";
  20. @PostMapping(value = "/test")
  21. public String server(@RequestBody Map<String, Object> param) throws InvalidKeySpecException,
  22. NoSuchAlgorithmException, InvalidKeyException, SignatureException, UnsupportedEncodingException {
  23. // 从参数中取出签名字符串并删除,因为sign不参与字符串拼接
  24. String sign = (String) param.remove("sign");
  25. // 对签名字符串进行url解码
  26. String decodeSign = URLDecoder.decode(sign, "UTF-8");
  27. // String decodeSign = URLDecoder.decode(sign, StandardCharsets.UTF_8.toString());
  28. // 将签名的参数内容按参数名的字典顺序进行排序,并拼接为字符串
  29. StringBuilder sb = new StringBuilder();
  30. param.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)).forEach(entry ->
  31. sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&")
  32. );
  33. String paramStr = sb.toString().substring(0, sb.length() - 1);
  34. // 使用公钥进行验签
  35. boolean result = JdkSignatureUtil.verifySignature(Constant.RSA_SIGN_PUBLIC_KEY, decodeSign, paramStr);
  36. if (result) {
  37. return "签名验证成功";
  38. }
  39. return "签名验证失败,非法请求";
  40. }
  41. }