diff --git a/inventory-dao/pom.xml b/inventory-dao/pom.xml index f004b5d..6447bfa 100644 --- a/inventory-dao/pom.xml +++ b/inventory-dao/pom.xml @@ -10,7 +10,7 @@ inventory-dao inventory-dao project for Spring Boot - 1.8 + 11 diff --git a/inventory-ent/pom.xml b/inventory-ent/pom.xml index bc6b68c..8a20df7 100644 --- a/inventory-ent/pom.xml +++ b/inventory-ent/pom.xml @@ -17,7 +17,7 @@ - 1.8 + 11 diff --git a/inventory-gov/pom.xml b/inventory-gov/pom.xml index 940b933..b348395 100644 --- a/inventory-gov/pom.xml +++ b/inventory-gov/pom.xml @@ -17,7 +17,7 @@ - 1.8 + 11 diff --git a/pom.xml b/pom.xml index c2bcde9..0a44c18 100644 --- a/pom.xml +++ b/pom.xml @@ -12,8 +12,8 @@ inventory project for Spring Boot - 1.8 - 1.8 + 11 + 11 diff --git a/utils/pom.xml b/utils/pom.xml index 8aae5ff..3f23c35 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -12,8 +12,8 @@ - 1.8 - 1.8 + 11 + 11 @@ -326,6 +326,12 @@ + + cn.hutool + hutool-all + 5.8.11 + + diff --git a/utils/src/main/java/com/common/utils/encryption/ENDEUtils.java b/utils/src/main/java/com/common/utils/encryption/ENDEUtils.java new file mode 100644 index 0000000..bdd76bc --- /dev/null +++ b/utils/src/main/java/com/common/utils/encryption/ENDEUtils.java @@ -0,0 +1,146 @@ +package com.common.utils.encryption; + + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; + +import com.alibaba.fastjson.JSONObject; + +import java.util.Base64.Decoder; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +/** + * 省清单数据对接请求响应加解密工具 + * Created by why on 2024/5/11. + */ +public class ENDEUtils { + + private static final String AES_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding"; + + private static final String AES = "AES"; + + private static final Decoder BASE64DECODER = Base64.getMimeDecoder(); + + private static final Integer NANOID_SIZE = 16; + + /** + * 请求加密公钥 + */ + private static final String RSA_PUBLIC = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfjUOMOQ3EYNv3f6ARlVSHHdPVJaNoUPA5rNH9TCaPDWg/Mm7dk15ic1kNp4lKCYjSf6HszdN5NQl/Z/CGXGheKQB6Qm8je5MWa2ZVdpUbaO3ihhKzs3KFNHGryOm4P4yjiE6wmj8fun0ILsmgXLISIfYazijkD4InL+I6Dbv7awIDAQAB"; + + /** + * 响应解密私钥 + */ + private static final String RSA_PRIVATE = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALUqZHsHpD8iV+zbKqPMHLpJUsoLcSIDEJ31sW7XI7cRdYxGb8YFf8Rorb7mzdhzczNushb7H+IAf115/cdOPjbpUzRQ2uPvn87acPoW5gi82KZB1IPqe4sB+jKTmBeYCvkM2QZSUDQZYyElgbZ+DA6DpOVd7nsHzBycYdHckZ9nAgMBAAECgYARi+sSfXF7ieyBLNMK7UyFAHAL0KLi+/AClJbcWOsFIqRDc1kFEWhIEilt2XXrdnccbqbCEg2K+qhbWeLqCFp/Fk+YupPRYzXNAbVVjtaX/RD9xYDZ4UUmywlEgroQqKM5oOqBDYBT5W15eRTPghA3gcx0/Njm9qi6CQtrJriN2QJBANhKZOdJRbj20GMfZrokQProvhTxKH4uWVrooStG44PLZbsr0O0iTG4uf0IucF2VTuJRJXsUvdRqo0GZKWufoX8CQQDWbSGuJkdmdvmbGTkDqPayOqWCOSVA/CWGjzysMOIEkHfoltispn+QiC6E9bkTJUcFKuctH80mKiww13OU/iYZAkB8o3I+LeU1z1UKqd/CyH2BmXlgDBBvljn7vy6RB8q3+g/nqjo9TJSKsdS3yJcL9qx8kpJsuOkjbUgi1yYdVOH1AkBolLmEkq7oTsbW2qpwGoyXyPrIVM7SryguRNY2tXDHAR86lbgAHQTCnWjy+FXX/Kpy3sX5wDTylEcRW0PIO1yhAkA7GH64sKTxinoL6WIbnqkJnBZT4b88WhiD7AIjSHxFAQYwFT1bhrmT7QNuNzt6uXLwSTP0MAiqCe0YZbE1UPh9"; + + private static final RSA RSA = new RSA(RSA_PRIVATE, RSA_PUBLIC); + + + /** + * AES解密 + * + * @param content 需要解密的字符串 + * @param key 密钥 + * @return + */ + public static String AESDecode(String content, String key) { + try { + SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), AES); + Cipher cipher = Cipher.getInstance(AES_CIPHER_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, skeySpec); + // 先用base64解密 + byte[] encrypted = BASE64DECODER.decode(content); + return new String(cipher.doFinal(encrypted), StandardCharsets.UTF_8.displayName()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + /** + * AES加密 + * + * @param content 需要加密的字符串 + * @param key 密钥 + * @return + * @throws Exception + */ + public static String AESEncode(String content, String key) { + try { + SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), AES); + Cipher cipher = Cipher.getInstance(AES_CIPHER_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec); + byte[] encrypted = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8.displayName())); + // 此处使用BASE64做转码功能,同时能起到2次加密的作用。 + return cn.hutool.core.codec.Base64.encodeStr(encrypted, false, false); +// return cn.hutool.core.codec.Base64.encode(encrypted); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + /** + * 加密请求参数Request + * FIXME + * + * @param request 请求参数JSON字符格式 + * @return + */ + public static JSONObject RSAEncryptRequest(String request) { + String randomKey = IdUtil.nanoId(NANOID_SIZE); + String encryptData = AESEncode(request, randomKey); + byte[] encrypt = RSA.encrypt(StrUtil.bytes(randomKey, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); + String encryptRandomKey = Base64.getEncoder().encodeToString(encrypt); + JSONObject json = new JSONObject(); + json.put("k", encryptRandomKey); + json.put("v", encryptData); + return json; + } + + /** + * 解密响应参数Response + * FIXME + * + * @param k,v 响应参数 k,v + * @return + */ + public static JSONObject RSADecryptResponse(String k, String v) { + byte[] decrypt = RSA.decrypt(Base64.getDecoder().decode(k), KeyType.PrivateKey); + String decryptData = AESDecode(v, new String(decrypt, CharsetUtil.CHARSET_UTF_8)); + return JSONObject.parseObject(decryptData); + } + + + public static void main(String[] args) { + //加密请求测试JSON格式字符参数 + String bodyStr = "{\"sysUniqueCode\":\"273556746985934848\"}"; + //加密请求参数 + JSONObject req = RSAEncryptRequest(bodyStr); + System.out.println("k----> "+req.getString("k")); + System.out.println("v----> "+req.getString("v")); + //数据市州CODE对接登录测试 + HttpResponse execute = HttpUtil.createPost("https://qdz.scasst.net/prod-api/auth/sync/getToken") + //临时取消加密 +// .header("bg-debug", "2") + .body(req.toJSONString()).execute(); + JSONObject res = JSONObject.parseObject(execute.body()); + //解密响应参数 + JSONObject response = RSADecryptResponse(res.getString("k"), res.getString("v")); + System.out.println("response ---> "+response); + + } + + +}