EncryptUtil.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package thyyxxk.webserver.utils;
  2. import cn.hutool.crypto.asymmetric.SM2;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.alibaba.fastjson.serializer.SerializerFeature;
  6. import org.bouncycastle.asn1.x9.X9ECParameters;
  7. import org.bouncycastle.util.encoders.Hex;
  8. import java.math.BigDecimal;
  9. import java.math.BigInteger;
  10. import java.nio.charset.StandardCharsets;
  11. import java.security.MessageDigest;
  12. import java.security.NoSuchAlgorithmException;
  13. import java.util.*;
  14. public class EncryptUtil {
  15. public static void main(String[] args) {
  16. sign(new JSONObject());
  17. }
  18. public static void sign(JSONObject jsonObject) {
  19. jsonObject = JSONObject.parseObject("{\"appId\":\"43AF047BBA47FC8A1AE8EFB2XXXXXXXX\", " +
  20. "\"data\":{\"appId\":\"43AF047BBA47FC8A1AE8EFB2XXXXXXXX\",\"userName\":\"测试\",\"appUserId\":\"o8z4C5avQXqC0aWFPf1Mzu6D7WC\n" +
  21. "Q_bd\",\"idNo\":\"350181199011193519\",\"idType\":\"01\",\"phoneNumber\":\"13763873033\"}, \"encType\":\"SM4\", \"signData\":\"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJupH\n" +
  22. "RGmyO5w==\", \"signType\":\"SM2\", \"timestamp\":\"20200207175759\", \"version\":\"2.0.1\"\n" +
  23. "}");
  24. // 生成原始签名串
  25. SortedMap<String, Object> treeMap = new TreeMap<>(jsonObject);
  26. String rawStr = getParamsFromMap(treeMap) + "key=4117E877F5FA0A0188891283E4B617D5";
  27. System.out.println(SM2Sign(rawStr));
  28. }
  29. private static String SM2Sign(String raw) {
  30. byte[] message = Hex.decode(raw);
  31. return raw;
  32. }
  33. private static String getParamsFromMap(SortedMap<String, Object> map) {
  34. // sign不参与签名
  35. map.remove("signData");
  36. map.remove("encData");
  37. map.remove("extra");
  38. StringBuilder sb = new StringBuilder();
  39. Set<Map.Entry<String, Object>> es = map.entrySet();
  40. Iterator<Map.Entry<String, Object>> it = es.iterator();
  41. while (it.hasNext()) {
  42. Map.Entry<String, Object> entry = it.next();
  43. String k = entry.getKey();
  44. Object objVal = entry.getValue();
  45. if (objVal == null) { //值为空的参数不参与签名
  46. continue;
  47. }
  48. String v;
  49. if (isBaseDataType(objVal.getClass())) {
  50. v = objVal.toString();
  51. } else {
  52. v = JSON.toJSONString(objVal, SerializerFeature.MapSortField);
  53. }
  54. if (!v.equals("")) {
  55. if (it.hasNext()) {
  56. sb.append(k).append("=").append(v).append("&");
  57. } else {
  58. sb.append(k).append("=").append(v);
  59. }
  60. }
  61. }
  62. return sb.toString();
  63. }
  64. private static boolean isBaseDataType(Class clazz) {
  65. return (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class)
  66. || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class)
  67. || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class)
  68. || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive());
  69. }
  70. }