CodecUtil.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. package nckd.fi.all.common.utils;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import kd.bos.script.annotations.KSObject;
  5. import org.apache.commons.codec.digest.DigestUtils;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.util.Base64Utils;
  9. import javax.crypto.Cipher;
  10. import javax.crypto.KeyGenerator;
  11. import javax.crypto.SecretKey;
  12. import javax.crypto.spec.SecretKeySpec;
  13. import java.nio.charset.Charset;
  14. import java.nio.charset.StandardCharsets;
  15. /**
  16. * @author bi lei
  17. * @date 2020/12/18 10:35
  18. */
  19. @KSObject
  20. public class CodecUtil {
  21. private static final Logger logger = LoggerFactory.getLogger(CodecUtil.class);
  22. private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
  23. /**
  24. * AES加密密钥
  25. */
  26. public static final byte[] AES_SECRET_KEY_BYTES = Base64Utils.decodeFromString("KSKiOQgLKcdaCZLbnkgG7V==");
  27. /**
  28. * SHA1加密密钥(用于增加加密的复杂度)
  29. */
  30. public static final String SHA1_SECRET_KEY = "uErQ0KY3J2CwttyuaeEYR2==";
  31. /**
  32. * 对业务数据进行加密,用AES加密再用Base64编码
  33. *
  34. * @param data 待加密数据
  35. * @return
  36. */
  37. public static String aesEncrypt(String data) {
  38. try {
  39. // 加密算法/工作模式/填充方式
  40. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  41. byte[] dataBytes = data.getBytes("UTF-8");
  42. cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(AES_SECRET_KEY_BYTES, "AES"));
  43. byte[] result = cipher.doFinal(dataBytes);
  44. return Base64Utils.encodeToString(result);
  45. } catch (Exception e) {
  46. logger.error("执行CodecUtil.aesEncrypt失败:data={},异常:{}", data, e);
  47. }
  48. return null;
  49. }
  50. /**
  51. * 对业务数据进行加密,用AES解密
  52. *
  53. * @param encryptedDataBase64
  54. * @return
  55. */
  56. public static String aesDecrypt(String encryptedDataBase64) {
  57. try {
  58. // 加密算法/工作模式/填充方式
  59. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  60. byte[] dataBytes = Base64Utils.decodeFromString(encryptedDataBase64);
  61. cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(AES_SECRET_KEY_BYTES, "AES"));
  62. byte[] result = cipher.doFinal(dataBytes);
  63. return new String(result);
  64. } catch (Exception e) {
  65. logger.error("执行CodecUtil.aesDecrypt失败:data={},异常:{}", encryptedDataBase64, e);
  66. }
  67. return null;
  68. }
  69. /**
  70. * 对业务数据进行加密,用AES加密再用Base64编码
  71. *
  72. * @param data 待加密数据
  73. * @return
  74. */
  75. public static String aesEncrypt(String data,String chartsetName) {
  76. try {
  77. // 加密算法/工作模式/填充方式
  78. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  79. if(chartsetName == null || chartsetName.length()==0){
  80. chartsetName = "UTF-8";
  81. }
  82. byte[] dataBytes = data.getBytes(chartsetName);
  83. cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(AES_SECRET_KEY_BYTES, "AES"));
  84. byte[] result = cipher.doFinal(dataBytes);
  85. return Base64Utils.encodeToString(result);
  86. } catch (Exception e) {
  87. logger.error("执行CodecUtil.aesEncrypt失败:data={},异常:{}", data, e);
  88. }
  89. return null;
  90. }
  91. /**
  92. * 对业务数据进行加密,用AES解密
  93. *
  94. * @param encryptedDataBase64
  95. * @return
  96. */
  97. public static String aesDecryp(String encryptedDataBase64,String chartsetName) {
  98. try {
  99. // 加密算法/工作模式/填充方式
  100. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  101. byte[] dataBytes = Base64Utils.decodeFromString(encryptedDataBase64);
  102. cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(AES_SECRET_KEY_BYTES, "AES"));
  103. byte[] result = cipher.doFinal(dataBytes);
  104. if(chartsetName == null || chartsetName.length()==0){
  105. chartsetName = "UTF-8";
  106. }
  107. return new String(result,chartsetName);
  108. } catch (Exception e) {
  109. logger.error("执行CodecUtil.aesDecrypt失败:data={},异常:{}", encryptedDataBase64, e);
  110. }
  111. return null;
  112. }
  113. /**
  114. * 对业务数据进行加密,用AES解密
  115. *
  116. * @param encryptedDataBase64
  117. * @return
  118. */
  119. public static String aesDecrypt(String encryptedDataBase64,byte[] aesSecretKeyBytes) {
  120. try {
  121. // 加密算法/工作模式/填充方式
  122. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  123. byte[] dataBytes = Base64Utils.decodeFromString(encryptedDataBase64);
  124. cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(aesSecretKeyBytes, "AES"));
  125. byte[] result = cipher.doFinal(dataBytes);
  126. return new String(result);
  127. } catch (Exception e) {
  128. logger.error("执行CodecUtil.aesDecrypt失败:data={},异常:{}", encryptedDataBase64, e);
  129. }
  130. return null;
  131. }
  132. /**
  133. * 对业务数据进行加密,用AES解密
  134. *
  135. * @param encryptedDataBase64
  136. * @return
  137. */
  138. public static String aesDecrypt(String encryptedDataBase64,byte[] aesSecretKeyBytes,String chartsetName) {
  139. try {
  140. // 加密算法/工作模式/填充方式
  141. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  142. byte[] dataBytes = Base64Utils.decodeFromString(encryptedDataBase64);
  143. cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(aesSecretKeyBytes, "AES"));
  144. byte[] result = cipher.doFinal(dataBytes);
  145. if(chartsetName == null || chartsetName.length()==0){
  146. chartsetName = "UTF-8";
  147. }
  148. return new String(result,chartsetName);
  149. } catch (Exception e) {
  150. logger.error("执行CodecUtil.aesDecrypt失败:data={},异常:{}", encryptedDataBase64, e);
  151. }
  152. return null;
  153. }
  154. /**
  155. * 对业务数据进行加密,用AES加密再用Base64编码
  156. *
  157. * @param data 待加密数据
  158. * @return
  159. */
  160. public static String aesEncrypt(String data,byte[] AES_SECRET_KEY_BYTES) {
  161. try {
  162. // 加密算法/工作模式/填充方式
  163. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  164. byte[] dataBytes = data.getBytes(DEFAULT_CHARSET);
  165. cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(AES_SECRET_KEY_BYTES, "AES"));
  166. byte[] result = cipher.doFinal(dataBytes);
  167. return Base64Utils.encodeToString(result);
  168. } catch (Exception e) {
  169. logger.error("执行CodecUtil.aesEncrypt失败:data={},异常:{}", data, e);
  170. }
  171. return null;
  172. }
  173. /**
  174. * 对业务数据进行加密,用AES解密
  175. *
  176. * @param encryptedDataBase64
  177. * @return
  178. */
  179. public static String aesDecryp(String encryptedDataBase64,byte[] AES_SECRET_KEY_BYTES) {
  180. try {
  181. // 加密算法/工作模式/填充方式
  182. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  183. byte[] dataBytes = Base64Utils.decodeFromString(encryptedDataBase64);
  184. cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(AES_SECRET_KEY_BYTES, "AES"));
  185. byte[] result = cipher.doFinal(dataBytes);
  186. return new String(result,DEFAULT_CHARSET);
  187. } catch (Exception e) {
  188. logger.error("执行CodecUtil.aesDecrypt失败:data={},异常:{}", encryptedDataBase64, e);
  189. }
  190. return null;
  191. }
  192. /**
  193. * 对数据进行加密,用SHA1加密再转换为16进制
  194. *
  195. * @param data
  196. * @return
  197. */
  198. public static String sha1Encrypt(String data,String SHA1_SECRET_KEY ) {
  199. return DigestUtils.sha1Hex(data + SHA1_SECRET_KEY);
  200. }
  201. /**
  202. * 对数据进行加密,用SHA1加密再转换为16进制
  203. *
  204. * @param data
  205. * @return
  206. */
  207. public static String sha1Encrypt(String data) {
  208. return DigestUtils.sha1Hex(data + SHA1_SECRET_KEY);
  209. }
  210. /**
  211. * AES密钥长度,支持128、192、256
  212. */
  213. private static final int AES_SECRET_KEY_LENGTH = 128;
  214. private static String generateAESSecretKeyBase64(String key) {
  215. try {
  216. KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  217. keyGenerator.init(AES_SECRET_KEY_LENGTH);
  218. SecretKey secretKey = keyGenerator.generateKey();
  219. return Base64Utils.encodeToString(secretKey.getEncoded());
  220. } catch (Exception e) {
  221. e.printStackTrace();
  222. }
  223. return null;
  224. }
  225. static class LoginDemoVo {
  226. private String account;
  227. private String password;
  228. public String getAccount() {
  229. return account;
  230. }
  231. public void setAccount(String account) {
  232. this.account = account;
  233. }
  234. public String getPassword() {
  235. return password;
  236. }
  237. public void setPassword(String password) {
  238. this.password = password;
  239. }
  240. }
  241. public static void main(String[] args) throws Exception {
  242. long timestamp = System.currentTimeMillis();
  243. JSONObject r = new JSONObject();
  244. // r.put("poundNo","");
  245. r.put("subtaskId","13111111111");
  246. r.put("validate","11111111");
  247. r.put("beginDate","2024-04-03 11:11:11");
  248. r.put("endDate","2024-04-03 11:11:11");
  249. r.put("poundNo","");
  250. r.put("unit",3);
  251. r.put("batchNo",3);
  252. r.put("productName",3);
  253. r.put("netWeight",3);
  254. // r.put("loadingStartDate","2024-04-03 11:11:11");
  255. // r.put("loadingEndDate","2024-04-03 11:11:11");
  256. r.put("remark",3);
  257. r.put("operationStatus",3);
  258. r.put("firstWeighingTime","2024-04-03 11:11:11");
  259. r.put("secondWeighingTime","2024-04-03 11:11:11");
  260. String data = JSON.toJSONString(r);
  261. //对参数进行加密
  262. String encryptedData = CodecUtil.aesEncrypt(data);
  263. //生成签名
  264. String sign = CodecUtil.sha1Encrypt(encryptedData + timestamp);
  265. //封装请求参数
  266. r = new JSONObject();
  267. r.put("encryptedData",encryptedData);
  268. r.put("timestamp",timestamp);
  269. r.put("sign",sign);
  270. //加密后的请求
  271. System.out.println("加密后的请求:" + JSON.toJSONString(r));
  272. //请求url
  273. // String url = "http://123.183.159.70:5066/sso-server/user/register";
  274. //返回结果
  275. // String result2 = HttpRequestor.doPost(url, JSON.toJSONString(r));
  276. // System.out.println(result2);
  277. }
  278. }