java110 лет назад: 4
Родитель
Сommit
989f60456b

+ 8 - 8
java110-core/src/main/java/com/java110/core/factory/AuthenticationFactory.java

@@ -72,10 +72,10 @@ public class AuthenticationFactory {
                 return null;
             }
             // 判断Key是否为16位
-            if (sKey.length() != 16) {
-                System.out.print("Key长度不是16位");
-                return null;
-            }
+//            if (sKey.length() != 16) {
+//                System.out.print("Key长度不是16位");
+//                return null;
+//            }
             byte[] raw = sKey.getBytes("utf-8");
             SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
             Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
@@ -98,10 +98,10 @@ public class AuthenticationFactory {
                 return null;
             }
             // 判断Key是否为16位
-            if (sKey.length() != 16) {
-                System.out.print("Key长度不是16位");
-                return null;
-            }
+//            if (sKey.length() != 16) {
+//                System.out.print("Key长度不是16位");
+//                return null;
+//            }
             byte[] raw = sKey.getBytes("utf-8");
             SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
             Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

+ 275 - 38
service-job/src/main/java/com/java110/job/adapt/hcToTianchuang/PersonToTianchuangAdapt.java

@@ -18,7 +18,6 @@ package com.java110.job.adapt.hcToTianchuang;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.core.client.RestTemplate;
-import com.java110.core.factory.AuthenticationFactory;
 import com.java110.core.factory.GenerateCodeFactory;
 import com.java110.dto.RoomAttrDto;
 import com.java110.dto.RoomDto;
@@ -49,14 +48,28 @@ import com.java110.po.machine.MachineRecordPo;
 import com.java110.po.owner.OwnerAttrPo;
 import com.java110.utils.cache.MappingCache;
 import com.java110.utils.util.*;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.net.URLDecoder;
+import java.security.GeneralSecurityException;
+import java.security.MessageDigest;
+import java.security.SecureRandom;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -69,7 +82,7 @@ import java.util.List;
  */
 @Component(value = "personToTianchuangAdapt")
 public class PersonToTianchuangAdapt extends DatabusAdaptImpl {
-
+    protected static MessageDigest messageDigest = null;
     private static Logger logger = LoggerFactory.getLogger(PersonToTianchuangAdapt.class);
     @Autowired
     private ICommunityInnerServiceSMO communityInnerServiceSMOImpl;
@@ -227,15 +240,11 @@ public class PersonToTianchuangAdapt extends DatabusAdaptImpl {
         pages.add(page);
 
         data.put("pages", pages);
+        String json = encryptStr(data.toJSONString(), TianChuangConstant.getAppSecret());
+        String result = httpPOST2(json, TianChuangConstant.SERVICE_ID_PERSON_INOUT);
+        JSONObject paramOut = JSONObject.parseObject(result);
 
-        String dataStr = AuthenticationFactory.AesDecrypt(data.toJSONString(), TianChuangConstant.getAppSecret());
-
-        HttpEntity httpEntity = new HttpEntity(dataStr, GetTianChuangToken.getHeaders(TianChuangConstant.SERVICE_ID_PERSON_INOUT, dataStr));
-        ResponseEntity<String> responseEntity = outRestTemplate.exchange(TianChuangConstant.getUrl(), HttpMethod.POST, httpEntity, String.class);
-        logger.debug("调用HC IOT信息:" + responseEntity);
-        JSONObject paramOut = JSONObject.parseObject(AuthenticationFactory.AesEncrypt(responseEntity.getBody(), TianChuangConstant.getAppSecret()));
-
-        String code = paramOut.getJSONObject("sta").getString("cod");
+        String code = paramOut.getJSONObject("sta").getString("code");
         if (!"0000".equals(code)) {
             throw new IllegalArgumentException("同步小区失败," + paramOut.toJSONString());
         }
@@ -297,14 +306,11 @@ public class PersonToTianchuangAdapt extends DatabusAdaptImpl {
 
         data.put("pages", pages);
 
-        String dataStr = AuthenticationFactory.AesDecrypt(data.toJSONString(), TianChuangConstant.getAppSecret());
-
-        HttpEntity httpEntity = new HttpEntity(dataStr, GetTianChuangToken.getHeaders(TianChuangConstant.SERVICE_ID_OWNER, dataStr));
-        ResponseEntity<String> responseEntity = outRestTemplate.exchange(TianChuangConstant.getUrl(), HttpMethod.POST, httpEntity, String.class);
-        logger.debug("调用HC IOT信息:" + responseEntity);
-        JSONObject paramOut = JSONObject.parseObject(AuthenticationFactory.AesEncrypt(responseEntity.getBody(), TianChuangConstant.getAppSecret()));
+        String json = encryptStr(data.toJSONString(), TianChuangConstant.getAppSecret());
+        String result = httpPOST2(json, TianChuangConstant.SERVICE_ID_OWNER);
+        JSONObject paramOut = JSONObject.parseObject(result);
 
-        String code = paramOut.getJSONObject("sta").getString("cod");
+        String code = paramOut.getJSONObject("sta").getString("code");
         if (!"0000".equals(code)) {
             throw new IllegalArgumentException("同步小区失败," + paramOut.toJSONString());
         }
@@ -358,15 +364,11 @@ public class PersonToTianchuangAdapt extends DatabusAdaptImpl {
         pages.add(page);
 
         data.put("pages", pages);
+        String json = encryptStr(data.toJSONString(), TianChuangConstant.getAppSecret());
+        String result = httpPOST2(json, TianChuangConstant.SERVICE_ID_MACHINE);
+        JSONObject paramOut = JSONObject.parseObject(result);
 
-        String dataStr = AuthenticationFactory.AesDecrypt(data.toJSONString(), TianChuangConstant.getAppSecret());
-
-        HttpEntity httpEntity = new HttpEntity(dataStr, GetTianChuangToken.getHeaders(TianChuangConstant.SERVICE_ID_MACHINE, dataStr));
-        ResponseEntity<String> responseEntity = outRestTemplate.exchange(TianChuangConstant.getUrl(), HttpMethod.POST, httpEntity, String.class);
-        logger.debug("调用HC IOT信息:" + responseEntity);
-        JSONObject paramOut = JSONObject.parseObject(AuthenticationFactory.AesEncrypt(responseEntity.getBody(), TianChuangConstant.getAppSecret()));
-
-        String code = paramOut.getJSONObject("sta").getString("cod");
+        String code = paramOut.getJSONObject("sta").getString("code");
         if (!"0000".equals(code)) {
             throw new IllegalArgumentException("同步小区失败," + paramOut.toJSONString());
         }
@@ -418,18 +420,13 @@ public class PersonToTianchuangAdapt extends DatabusAdaptImpl {
         pages.add(page);
 
         data.put("pages", pages);
-
-        String dataStr = AuthenticationFactory.AesDecrypt(data.toJSONString(), TianChuangConstant.getAppSecret());
-
-        HttpEntity httpEntity = new HttpEntity(dataStr, GetTianChuangToken.getHeaders(TianChuangConstant.SERVICE_ID_COMMUNITY, dataStr));
-        ResponseEntity<String> responseEntity = outRestTemplate.exchange(TianChuangConstant.getUrl(), HttpMethod.POST, httpEntity, String.class);
-        logger.debug("调用HC IOT信息:" + responseEntity);
-        JSONObject paramOut = JSONObject.parseObject(AuthenticationFactory.AesEncrypt(responseEntity.getBody(), TianChuangConstant.getAppSecret()));
-
+        logger.debug("发送小区加密前,{}", data.toJSONString());
+        String json = encryptStr(data.toJSONString(), TianChuangConstant.getAppSecret());
+        String result = httpPOST2(json, TianChuangConstant.SERVICE_ID_COMMUNITY);
+        JSONObject paramOut = JSONObject.parseObject(result);
         String code = paramOut.getJSONObject("sta").getString("code");
         if (!"0000".equals(code)) {
-
-            throw new IllegalArgumentException("同步小区失败," + AuthenticationFactory.AesDecrypt(paramOut.getJSONObject("sta").getString("des"), TianChuangConstant.getAppSecret()));
+            throw new IllegalArgumentException("同步小区失败," + decryptStr(paramOut.getJSONObject("sta").getString("des"), TianChuangConstant.getAppSecret()));
         }
         String extTcCommunityId = paramOut.getJSONArray("data").getJSONObject(0).getString("result");
         CommunityAttrPo communityAttrPo = new CommunityAttrPo();
@@ -442,4 +439,244 @@ public class PersonToTianchuangAdapt extends DatabusAdaptImpl {
         return extTcCommunityId;
     }
 
+
+    /**
+     * 字符串加密
+     *
+     * @param srcStr   加密字符串
+     * @param password 加密密钥
+     */
+    public static String encryptStr(String srcStr, String password) {
+        byte[] encryptResult = encryptData_AES(srcStr, password);
+        String encryptResultStr = parseByte2HexStr(encryptResult);
+        return encryptResultStr;
+    }
+
+    /**
+     * 加密
+     *
+     * @param content  需要加密的内容
+     * @param password 加密密码
+     * @return
+     */
+    private static byte[] encryptData_AES(String content, String password) {
+        try {
+            //SecretKey secretKey = getKey(password);
+            //byte[] enCodeFormat = secretKey.getEncoded();
+            byte[] enCodeFormat = parseHexStr2Byte(password);
+            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
+            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
+            byte[] byteContent = content.getBytes("utf-8");
+            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
+            byte[] result = cipher.doFinal(byteContent);
+            return result; // 加密
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 将二进制转换成16进制
+     *
+     * @param buf
+     * @return
+     */
+    private static String parseByte2HexStr(byte buf[]) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < buf.length; i++) {
+            String hex = Integer.toHexString(buf[i] & 0xFF);
+            if (hex.length() == 1) {
+                hex = '0' + hex;
+            }
+            sb.append(hex.toUpperCase());
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 字符串解密
+     *
+     * @param srcStr   解密字符串
+     * @param password 加密密钥
+     */
+    public static String decryptStr(String srcStr, String password) {
+        String returnValue = "";
+        try {
+            byte[] decryptFrom = parseHexStr2Byte(srcStr);
+            byte[] decryptResult = decryptData_AES(decryptFrom, password);
+            returnValue = new String(decryptResult, "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return returnValue;
+    }
+
+
+    /**
+     * 将16进制转换为二进制
+     *
+     * @param hexStr
+     * @return
+     */
+    private static byte[] parseHexStr2Byte(String hexStr) {
+        if (hexStr.length() < 1)
+            return null;
+        byte[] result = new byte[hexStr.length() / 2];
+        for (int i = 0; i < hexStr.length() / 2; i++) {
+            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
+            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
+                    16);
+            result[i] = (byte) (high * 16 + low);
+        }
+        return result;
+    }
+
+    /**
+     * 生成指定字符串的密钥
+     *
+     * @param secret 要生成密钥的字符
+     * @return secretKey 生成后的密钥
+     * @throws GeneralSecurityException
+     */
+    public static SecretKey getKey(String secret) throws GeneralSecurityException {
+        try {
+            KeyGenerator _generator = KeyGenerator.getInstance("AES");
+            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
+            secureRandom.setSeed(secret.getBytes());
+            _generator.init(128, secureRandom);
+            return _generator.generateKey();
+        } catch (Exception e) {
+            throw new RuntimeException("初始化密钥出现异常");
+        }
+    }
+
+    /**
+     * 解密
+     *
+     * @param content  待解密内容
+     * @param password 解密密钥
+     * @return
+     */
+    private static byte[] decryptData_AES(byte[] content, String password) {
+        try {
+            SecretKey secretKey = getKey(password);
+            byte[] enCodeFormat = secretKey.getEncoded();
+            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
+            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
+            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
+            byte[] result = cipher.doFinal(content);
+            return result; // 加密
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String md5(String str) {
+        if (str == null) {
+            return null;
+        }
+        try {
+            messageDigest = MessageDigest.getInstance("MD5");
+            messageDigest.reset();
+            messageDigest.update(str.getBytes("UTF-8"));
+        } catch (Exception e) {
+            return str;
+        }
+        byte[] byteArray = messageDigest.digest();
+        StringBuffer md5StrBuff = new StringBuffer();
+        for (int i = 0; i < byteArray.length; i++) {
+            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
+                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
+            else
+                md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
+        }
+        return md5StrBuff.toString().toUpperCase();
+    }
+
+    public static String httpPOST2(String json, String serviceId) {
+
+        String url = TianChuangConstant.getUrl();
+        String appId = TianChuangConstant.getAppId();
+        String appSecret = TianChuangConstant.getAppSecret();
+        HttpClient client = new DefaultHttpClient();
+        HttpPost post = new HttpPost(url);
+        post.setHeader("appid", appId);
+        String currdate = new SimpleDateFormat("yyyyMMdd").format(new Date());
+        String token = md5(appId + appSecret + currdate + json.replaceAll("\r\n", ""));
+        System.out.println("token:" + token);
+
+        post.setHeader("token", token);
+        post.setHeader("tranId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_tranId));
+        post.setHeader("serviceId", serviceId);
+        post.setHeader("serviceValue", serviceId);
+        post.setHeader("versionCode", "1.0");
+
+
+        String body = "";
+
+        logger.debug("请求报文={}", json);
+        try {
+            StringEntity s = new StringEntity(json, "UTF-8");
+            s.setContentType("application/json");
+            post.setEntity(s);
+            HttpResponse res = client.execute(post);
+            HttpEntity entity = res.getEntity();
+            if (entity != null) {
+                body = EntityUtils.toString(entity, "utf-8");
+            }
+            body = URLDecoder.decode(body, "utf-8");
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+        logger.debug("返回报文={}", body);
+
+        return body;
+    }
+
+    public static String httpPOST(String url, String json) {
+        HttpClient client = new DefaultHttpClient();
+        HttpPost post = new HttpPost(url);
+
+        String body = "";
+
+        try {
+            StringEntity s = new StringEntity(json, "UTF-8");
+            s.setContentType("application/json");
+            post.setEntity(s);
+            HttpResponse res = client.execute(post);
+            HttpEntity entity = res.getEntity();
+            if (entity != null) {
+                body = EntityUtils.toString(entity, "utf-8");
+            }
+            return URLDecoder.decode(body, "utf-8");
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+        return "";
+    }
+
+    private static final String SECRETKEY = "CAD3218426800B9FE0532D03A8C0310E";
+
+    public static void main(String[] args) throws Exception {
+        //String json = "{\"datas\":[{\"gmsfhm\":\"370122197507084821\",\"name\":\"李冰\"}],\"pages\":{\"psize\":\"10\",\"tcount\":\"\",\"pno\":\"1\",\"tsize\":\"\"}}";
+        // 加密
+        //String encryptResultStr = encryptStr(json, SECRETKEY);
+        //String a = "CB42C3F519BC831961E4CE27AA00FA6DEF0E494A467187F77E01CDC8FC4605295FD1BED29065B244E4C2B1AB86D0BCE7A5914F2DF70C5360F2C58D9B2B9DC32D16EF3CB68AD1A7BEC820D690763511E57A55B13D4F0558BA64A14B2DEB3B5C762CC84D88DF60F223A467FF53615D9B7DF0BC32A20F96637D425F82A4CDD7A311";
+        //System.out.println("加密后1:" + encryptResultStr);
+        // System.out.println("加密后2:" +a);
+        // System.out.println("加密后3:CB42C3F519BC831961E4CE27AA00FA6DEF0E494A467187F77E01CDC8FC4605295FD1BED29065B244E4C2B1AB86D0BCE7A5914F2DF70C5360F2C58D9B2B9DC32D16EF3CB68AD1A7BEC820D690763511E57A55B13D4F0558BA64A14B2DEB3B5C762CC84D88DF60F223A467FF53615D9B7D71A92761E9E455F104519DF3AFA4E5F2");
+        // 解密
+        String encryptResultStr = "%E8%AF%B7%E6%B1%82%E4%B8%8D%E5%90%88%E6%B3%95%EF%BC%8C%E5%8C%85%E4%BD%93%E6%A0%BC%E5%BC%8F%E9%94%99%E8%AF%AF";
+        String decryptResultStr = decryptStr(encryptResultStr, SECRETKEY);
+        System.out.println("解密后:" + decryptResultStr);
+
+        //String decryptResultStr = decryptStr(a, "60F10B41F44BD4856C0C1952BF40690C");
+        //System.out.println(decryptResultStr);
+
+        //	System.out.println(getKey("9A1158154DFA42CADDBD0694A4E9BDC8"));
+
+    }
+
 }

+ 1 - 1
service-job/src/main/java/com/java110/job/adapt/hcToTianchuang/TianChuangConstant.java

@@ -34,7 +34,7 @@ public class TianChuangConstant {
     private static final String DEFAULT_TC_URL = "http://112.51.96.125:9080/ywxzservice/dbClient.do";
     //
     private static final String DEFAULT_APP_ID = "26810B9FE0532D03";
-    private static final String DEFAULT_APP_SECRET = "CAD3218426800B9FE0532D03A8C0310E";
+    public static final String DEFAULT_APP_SECRET = "CAD3218426800B9FE0532D03A8C0310E";
     private static final String DEFAULT_COMPANY = "122350112432"; //单位编号
 
     private static final String TC_COMPANY = "COMPANY";//公司