diff --git a/pom.xml b/pom.xml index 54d4315..a27979a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ pom com.data2.easybuild easybuild-framework - 0.0.1-SNAPSHOT + 0.0.2 easybuild-framework framework for dev diff --git a/server-common/src/main/java/com/data2/easybuild/server/common/aop/AbstractOpenApiAop.java b/server-common/src/main/java/com/data2/easybuild/server/common/aop/AbstractOpenApiAop.java index f4e6a7e..5d6aee6 100644 --- a/server-common/src/main/java/com/data2/easybuild/server/common/aop/AbstractOpenApiAop.java +++ b/server-common/src/main/java/com/data2/easybuild/server/common/aop/AbstractOpenApiAop.java @@ -10,7 +10,7 @@ import com.data2.easybuild.server.common.env.ServerLog; import com.data2.easybuild.server.common.env.SpringContextHolder; import com.data2.easybuild.server.common.lock.RequestDupIntecept; -import com.data2.easybuild.server.common.util.IpUtils; +import com.data2.easybuild.utils.IpUtils; import jodd.exception.ExceptionUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; diff --git a/utils-common/pom.xml b/utils-common/pom.xml index 8ccde15..0d229c1 100644 --- a/utils-common/pom.xml +++ b/utils-common/pom.xml @@ -15,17 +15,28 @@ org.apache.commons commons-lang3 + 3.15.0 + provided org.slf4j slf4j-api - compile + 2.0.16 + provided org.projectlombok lombok - compile + 1.18.34 + provided + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + diff --git a/utils-common/src/main/java/com/data2/easybuild/utils/CaptchaUtils.java b/utils-common/src/main/java/com/data2/easybuild/utils/CaptchaUtils.java index 216d93e..4ec6934 100644 --- a/utils-common/src/main/java/com/data2/easybuild/utils/CaptchaUtils.java +++ b/utils-common/src/main/java/com/data2/easybuild/utils/CaptchaUtils.java @@ -1,11 +1,5 @@ package com.data2.easybuild.utils; -/** - * @author data2 - * @description - * @date 2021/1/29 下午5:03 - */ - import java.awt.*; import java.awt.image.BufferedImage; import java.security.SecureRandom; diff --git a/server-common/src/main/java/com/data2/easybuild/server/common/util/CookieUtils.java b/utils-common/src/main/java/com/data2/easybuild/utils/CookieUtils.java similarity index 95% rename from server-common/src/main/java/com/data2/easybuild/server/common/util/CookieUtils.java rename to utils-common/src/main/java/com/data2/easybuild/utils/CookieUtils.java index 0420dc9..04f2571 100644 --- a/server-common/src/main/java/com/data2/easybuild/server/common/util/CookieUtils.java +++ b/utils-common/src/main/java/com/data2/easybuild/utils/CookieUtils.java @@ -1,10 +1,4 @@ -package com.data2.easybuild.server.common.util; - -/** - * @author data2 - * @description - * @date 2021/1/29 下午5:07 - */ +package com.data2.easybuild.utils; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; diff --git a/utils-common/src/main/java/com/data2/easybuild/utils/DateUtils.java b/utils-common/src/main/java/com/data2/easybuild/utils/DateUtils.java index 5f27acf..b95f0a7 100644 --- a/utils-common/src/main/java/com/data2/easybuild/utils/DateUtils.java +++ b/utils-common/src/main/java/com/data2/easybuild/utils/DateUtils.java @@ -1,11 +1,5 @@ package com.data2.easybuild.utils; -/** - * @author data2 - * @description - * @date 2021/1/29 下午5:07 - */ - import org.apache.commons.lang3.time.DateFormatUtils; import java.text.ParseException; diff --git a/server-common/src/main/java/com/data2/easybuild/server/common/util/IpUtils.java b/utils-common/src/main/java/com/data2/easybuild/utils/IpUtils.java similarity index 85% rename from server-common/src/main/java/com/data2/easybuild/server/common/util/IpUtils.java rename to utils-common/src/main/java/com/data2/easybuild/utils/IpUtils.java index cbbfed4..b0d0d0d 100644 --- a/server-common/src/main/java/com/data2/easybuild/server/common/util/IpUtils.java +++ b/utils-common/src/main/java/com/data2/easybuild/utils/IpUtils.java @@ -1,14 +1,6 @@ -package com.data2.easybuild.server.common.util; - -/** - * @author data2 - * @description - * @date 2021/1/29 下午5:15 - */ +package com.data2.easybuild.utils; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; @@ -45,7 +37,7 @@ public static String getServerIpAddr() { try { address = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { - log.error("获取服务器本地ip异常", e); + log.error("get server local ip exception ", e); } return address; } diff --git a/utils-common/src/main/java/com/data2/easybuild/utils/PropertiesUtil.java b/utils-common/src/main/java/com/data2/easybuild/utils/PropertiesUtil.java index 43becb1..97dfe1c 100644 --- a/utils-common/src/main/java/com/data2/easybuild/utils/PropertiesUtil.java +++ b/utils-common/src/main/java/com/data2/easybuild/utils/PropertiesUtil.java @@ -1,16 +1,9 @@ package com.data2.easybuild.utils; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; - import java.util.Map; import java.util.Properties; -/** - * @author data2 - * @description - * @date 2020/11/29 上午12:35 - */ @Slf4j public class PropertiesUtil { public static void print(Object properties) { diff --git a/utils-common/src/main/java/com/data2/easybuild/utils/RsaUtil.java b/utils-common/src/main/java/com/data2/easybuild/utils/RsaUtil.java index 2e18fe6..5fc1f8f 100644 --- a/utils-common/src/main/java/com/data2/easybuild/utils/RsaUtil.java +++ b/utils-common/src/main/java/com/data2/easybuild/utils/RsaUtil.java @@ -1,93 +1,146 @@ package com.data2.easybuild.utils; +import lombok.extern.slf4j.Slf4j; + import javax.crypto.Cipher; import java.security.*; -import java.security.interfaces.RSAPrivateKey; -import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; +import java.util.ArrayList; import java.util.Base64; +import java.util.List; +@Slf4j public class RsaUtil { - //取值 SHA256WithRSA 或者 SHA1WithRSA - //RSA 对应 SHA1WithRSA - //RSA2 对应 SHA256WithRSA 至少2048 位以上 - public static final String SHA_WITH_RSA_ALGORITHM = "SHA256WithRSA"; - - public static final String MD5_WITH_RSA = "MD5WithRSA"; - - public static final int KEY_SIZE_2048 = 2048; + /** + * generate Rsa Pair + * + * @throws Exception + */ + public static KeyPair generateRsaPair() throws Exception { + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + return keyGen.generateKeyPair(); + } - public static final int KEY_SIZE_1024 = 1024; + private static String publicKeyToString(PublicKey publicKey) throws Exception { + byte[] encoded = publicKey.getEncoded(); + return Base64.getEncoder().encodeToString(encoded); + } - public static final String ALGORITHM = "RSA"; + private static String privateKeyToString(PrivateKey privateKey) throws Exception { + byte[] encoded = privateKey.getEncoded(); + return Base64.getEncoder().encodeToString(encoded); + } - public static final String CHARSET = "UTF-8"; /** - * RSA公钥加密 + * generate Rsa Pair,turn to String + * return list + * + * @throws Exception */ - public static String encrypt(String str, String publicKey) throws Exception { - //base64编码的公钥 - byte[] decoded = Base64.getDecoder().decode(publicKey); - RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(ALGORITHM).generatePublic(new X509EncodedKeySpec(decoded)); - //RSA加密 - Cipher cipher = Cipher.getInstance(ALGORITHM); - cipher.init(Cipher.ENCRYPT_MODE, pubKey); - String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes(CHARSET))); - return outStr; + public static List generateRsaPairString() throws Exception { + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + KeyPair pair = keyGen.generateKeyPair(); + + PublicKey publicKey = pair.getPublic(); + PrivateKey privateKey = pair.getPrivate(); + + try { + String publicKeyString = publicKeyToString(publicKey); + String privateKeyString = privateKeyToString(privateKey); + + log.info("publicKey:{} ", publicKeyString); + log.info("privateKey:{}", privateKeyString); + + ArrayList result = new ArrayList<>(); + result.add(publicKeyString); + result.add(privateKeyString); + return result; + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + + } + + private static PublicKey stringToPublicKey(String key) throws Exception { + byte[] keyBytes = Base64.getDecoder().decode(key); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePublic(keySpec); + } + + private static PrivateKey stringToPrivateKey(String key) throws Exception { + byte[] keyBytes = Base64.getDecoder().decode(key); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return keyFactory.generatePrivate(keySpec); + } + + private static byte[] encryptInner(PublicKey publicKey, String plainText) throws Exception { + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + return cipher.doFinal(plainText.getBytes("UTF-8")); + } + + private static String decryptInner(PrivateKey privateKey, byte[] cipherText) throws Exception { + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] decryptedBytes = cipher.doFinal(cipherText); + return new String(decryptedBytes, "UTF-8"); } /** - * RSA私钥解密 + * loading public key string and encrypt + * + * @param */ - public static String decrypt(String str, String privateKey) throws Exception { - //64位解码加密后的字符串 - byte[] inputByte = java.util.Base64.getDecoder().decode(str.getBytes(CHARSET)); - //base64编码的私钥 - byte[] decoded = Base64.getDecoder().decode(privateKey); - RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(ALGORITHM).generatePrivate(new PKCS8EncodedKeySpec(decoded)); - //RSA解密 - Cipher cipher = Cipher.getInstance(ALGORITHM); - cipher.init(Cipher.DECRYPT_MODE, priKey); - String outStr = new String(cipher.doFinal(inputByte)); - return outStr; + public static String encryt(String text, String publicKeyStr) { + try { + PublicKey publicKey = stringToPublicKey(publicKeyStr); + byte[] cipherText = encryptInner(publicKey, text); + String cipherTextStr = Base64.getEncoder().encodeToString(cipherText); + log.info("origin text: {} ", text); + log.info("encry text: {}", cipherTextStr); + return cipherTextStr; + } catch (Exception e) { + e.printStackTrace(); + } + return null; } /** - * 随机生成密钥对 - * 也可以用阿里的生成工具 + * loading private key string and decrypt + * + * @param */ - public static void genKeyPair(Integer keySize) throws NoSuchAlgorithmException { - //推荐 2048位以上,保证安全性 - if (keySize == null) { - keySize = KEY_SIZE_2048; + public static String decrypt(String cipherText, String privateKeyStr) { + try { + PrivateKey privateKey = stringToPrivateKey(privateKeyStr); + String decryptedText = decryptInner(privateKey, Base64.getDecoder().decode(cipherText)); + log.info("cipher text: {}", cipherText); + log.info("decrypt text: {}", decryptedText); + return decryptedText; + } catch (Exception e) { + e.printStackTrace(); } - // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象 - KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGORITHM); - // 初始化密钥对生成器,密钥大小为96-1024位 - keyPairGen.initialize(keySize, new SecureRandom()); - // 生成一个密钥对,保存在keyPair中 - KeyPair keyPair = keyPairGen.generateKeyPair(); - RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥 - RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥 - String publicKeyString = new String(Base64.getEncoder().encode(publicKey.getEncoded())); - // 得到私钥字符串 - String privateKeyString = new String(Base64.getEncoder().encode(privateKey.getEncoded())); - // 将公钥和私钥保存到Map - System.out.println("公钥:" + publicKeyString); - System.out.println("私钥:" + privateKeyString); + return null; } + /** + * demo for using. + * + * @param args + * @throws Exception + */ public static void main(String[] args) throws Exception { -// genKeyPair(2048); -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 - String enstr = encrypt("{\"orderId\":\"1231\"}", - "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnXGLzkLAH0qsOa26JFdR5foJ/aBTE6nq9rSID+AEh+jyx7iMLX2QmvTcCT1XevFkOeWW/nJSjKtu1ypYyjf/aqintd//hSClTaLgqOpDemGJon1JrlFmNuG2GPztk4hVzcG9XWBc2+PHg3Y5F6NxKZ8eK+Xi6VChaWrafNEbmAFX9Nqe3meQe6Ec/zePIMcg1yiteyyAPjuFLjENwkHqw8h2V1GQ3awRUo/15vdI6edAqQjx7L3/5KDnJfQ40Qk4BqMt2wsjCDJmIkwU7S89apQF30r8isIDtzXOkqEBJ753rcI/Ny2iZ50L+UoNHMGJuoxb2TubEn+Z9LUgrHEAMQIDAQAB"); - System.out.println(enstr); - - String s = decrypt(enstr,"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCdcYvOQsAfSqw5rbokV1Hl+gn9oFMTqer2tIgP4ASH6PLHuIwtfZCa9NwJPVd68WQ55Zb+clKMq27XKljKN/9qqKe13/+FIKVNouCo6kN6YYmifUmuUWY24bYY/O2TiFXNwb1dYFzb48eDdjkXo3Epnx4r5eLpUKFpatp80RuYAVf02p7eZ5B7oRz/N48gxyDXKK17LIA+O4UuMQ3CQerDyHZXUZDdrBFSj/Xm90jp50CpCPHsvf/koOcl9DjRCTgGoy3bCyMIMmYiTBTtLz1qlAXfSvyKwgO3Nc6SoQEnvnetwj83LaJnnQv5Sg0cwYm6jFvZO5sSf5n0tSCscQAxAgMBAAECggEAKUPuabQzGMCAnWl8RTQhwg4j+jbAL4I0lE7C7q4/YcPbhh9HllC3yvVsintqZ03HgCk9xxj9q+Lu3TQ7K10785+avV+lYCYrTUroaT1lTDkuUslVu3uYN8A28xuvxSBRpOknkcbE79kmnL0qv5hV+5u507WgIJjChZe9BkPkYJVnj9g516R5UzfNA8Hxeq2fGRiHQ1q+T6ueL7t+eWpkyk9Q95jjIEkfHdfo41KdUqi/KKCLKxMoIqE/ubUzWwxP+MH6IvF+NivwzOYAk8pgD5DwRva6V4QsBxJ9yUDvp71r/RQA4ekYlLngaTGcQGj8SDVNDUN2Uf+aPn7I+nPhxQKBgQDifLG5lfPT0d6dvGyYkv73l9QeVpehvDXmZqcl6j6nL+1TstuGUrgZVzFNnvyJETsYCyv0S6ruKe/Ky59dBk7JJU/+M9XiXOndb+4b5B2lToZnAAXo4sNJO4ZfaPT4k6gJCAcMZkVkyoCHyhdvNeNhxZq9eiAiilPTaq0a/T7ujwKBgQCx9abSPPToSmtSe2XDh4VWJDJCsFzdwa0vIYgdNxH4hvZ26LEyqSyFpEHtV1pB3JskMxkSBehhz0xAoQVFqepVSiDQOezRjW3WletAl0eyV0PyXSVfRhIFRBoSa9GMH3clY3RvwiNTiiWqRuyMULHxCLKHEZX0ic/BvR7gmbyFPwKBgHUbAFHzJNWbKD3q1UO2jbq7eGQPZeusgzoUTcye57JOZ6nlSviTALmpicaWtACzNhjifeGc1k66xE/ZJRdWUZpTfp7zcl3OqOVkIHuvYVy902SicGvQBCVzb7EZdcCpqDKzQeG5Z5wL0JVleuR3upAtOitKYB874sfn2oWf99AlAoGAZtUaVrYelvQZ3AmuHjR7WfGEkYCzyPiXiHqJ2sftvHzQgpmneyzCq17lMa6eWxyNEXftbrq3M33EBDyHfV/YJvy0xV4TeGuPIsZysFo6ddVzT+N/KvSkiSJ3JlnjNmMgSByWNdYq76UOarydB9/BUxTBhMcmra3MvZj49LQheaUCgYAOqU78aIW7hsyDmozN3qcID9GkmSwc3HaoGdK6YR6JAblcCX88pxZSNGDCZ4cgGmrONGNfdNJnXnqsWPTIXZ/CEAydhXLbvzDQ9gLX7psQg6ZoL4+ubdN95syXcVqAW1PwHDL3slPcuKHUVsCx7zg7DjjlyiOMLKBEdnx1RMkmfA=="); - System.out.println(s); + encryt("111", "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu3nYjLKetKekMGLAxju8CJUOyp4G5MaKXM5tDdHXyzTchBF4/HDl3TAG1SyqD2Xwzy5YLfnMeR0wX3fLN/jIdr3OsDgSUyJuQ9XTjbNQHzFa4U6LRvdaq5Orr1r2wclw4dvtGmUHYnAKdvyOZbukKYRDizLGfvH4U6wmKY/yFVZupuiQYnwyxDBDZT4JK3PjzlNjV3WgcAuna2/V6YBHDFDsey79u4hORJKET7MEzhbdoatR5zF/QmGXoWibYv9TARgSxxWYwqa/Pq1ZacEJrUu3ls61EDy14dQvJDC03A9M8fW/VkHVjQu/SfK54/1P/YQzPrURmGVITwiwvA4p+QIDAQAB"); + decrypt("I1OBOrejMfRNMZOeNXt/r9kstQB2IHTz+zvp+UbOsgL5HlSUcbEeIbGRy+/vkQQtSk6gccBAr+tohZ9XfeKwgdrUqlZ9J9j6DQSrxZNkWbry+BVAY6b0PGQYZEJDOl1UUd6a7yYs95p73ilIzwXUo4cby5/cYDdw2pTzismWjyNEu3nI3lrxlwZWxL094gSVe89zsaCAkWU/rZxBR+5HApTK+w+DgruqHQaUvH7ZA2rEhLs/2aUxQ8ngIAcwhaeDPo4bVvxu4b/1g6WdJ1EJaGgDr8VabAwSYqYdzXrXn8kGuxjRgaxMP7qs2e9M356hWRmHDMCoIep+CDycgzxmlQ==", + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7ediMsp60p6QwYsDGO7wIlQ7Kngbkxopczm0N0dfLNNyEEXj8cOXdMAbVLKoPZfDPLlgt+cx5HTBfd8s3+Mh2vc6wOBJTIm5D1dONs1AfMVrhTotG91qrk6uvWvbByXDh2+0aZQdicAp2/I5lu6QphEOLMsZ+8fhTrCYpj/IVVm6m6JBifDLEMENlPgkrc+POU2NXdaBwC6drb9XpgEcMUOx7Lv27iE5EkoRPswTOFt2hq1HnMX9CYZehaJti/1MBGBLHFZjCpr8+rVlpwQmtS7eWzrUQPLXh1C8kMLTcD0zx9b9WQdWNC79J8rnj/U/9hDM+tRGYZUhPCLC8Din5AgMBAAECggEAYTlAPz8GpQNnV5xvAp7J1d2PTS6EvrHj4VtAHPGdKongbjEtgCUAYCPe90BxdQjVyGvtWPJ5wrmLc4cJgZ5oP4QRozuA7VImwtEqJAtA2txamAuGmSgAAojTeV4AJ+FSxB6sqIqKONeH5cr2AfY8nTc1XAPaAs1zjdjx9Y3r6noEKvNq1nb94YjUiRMAVr8M8vA6IDsFEaH+dTsf68A9Tvwd9c7B3ANfQNLoaygVTLjA6oThP885uY4GBCarSIUq4563rAsWAfvgR+tWM+wkkKJAAVDEaVBvQO97u9AVrlB1JKCI3zqXAGrdLu0cUO5V2EN3o7WaO02iLNumKadF3QKBgQDeM4Um5ErwraZVMUNUNOvpiR6h9P6E7r9kNEUKJg9kZVObNNUid/DuTFEBQLTRbyFUsFx0bSOjEGzPSmeN9ct9SiJ1MzWCrW5vgoTsEmNgXPtKa5hSKvWgp4mVr3bGS2xlFfVDWL7vgi+H8DYUboPhNyNYfygpylZcx1nFEjSgXwKBgQDX/iD0zbZMZVI6iTfdsSfj9bOPoWGjXh01KJZ5+KH+1iGEoWslRy62ML8zk8xubt/cFusYGlpRAALuc7JtV2K0h20VQKNHFmNqsdGneTp7XlFuUxM2arSyMqfYG3pAC9snRep2tFL4CXmsm3gQH5QmxOwY342k44TP1m1b/YH0pwKBgHUQ77Xt0Q28b0WzDqXuu9vuQhVR3kZrAqroXvdZ1gIu4D2FOEVQq77gtkzSqnEs+4KC6DLuzTe8D5emu6gvN2ZrCHx23lpaxTQ6r40wourCEiLDTRz9RSu/GN2j9A/E7PbU+sLgnrfQ/vm/tL5O+2xMgHK/i4l48McwwDrzvIZBAoGAcerJbPPWMwK5VMAsY9Ncq6FZ2+YMvgIUO4Y1nwzgO6yqLu6HuTiKzXJ2VXidOJ1nmgfIZIT5n4D3Ctagg4S0PWyzvqLBuut28b3pSn/otUpwflR4bJnoxZdr6NHNL1xRcKwyVfsTS1iMANpaf354P95ae1/kr9ODp657LSpOUT8CgYEA0GCcmzy3eN8lUUazyCAXoLKj1OsEkd6RGJro3CTHGL8hHUzVG5HQMR9GwweHXQde5nejqgVXJHmHcCuLFdY7nwiPbweNPwHvAeS643sskXZtelGRSrOumNSu+WaRjmFV0Cresqw1bUEyItIkFONYj46zE6w3HO2t4uAKD3yueZ8="); } -} +} \ No newline at end of file