From c634bd69c1da46b0ef80a42811288646a2ab126c Mon Sep 17 00:00:00 2001
From: hurui <177768073@qq.com>
Date: Thu, 26 Aug 2021 16:57:54 +0800
Subject: [PATCH] =?UTF-8?q?'=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A2=BC'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bweb/controller/HighCouponController.java | 1 +
.../java/com/hai/common/security/DESUtil.java | 251 ++++++++++--------
.../config/HuiLianTongUnionCardConfig.java | 10 +-
3 files changed, 146 insertions(+), 116 deletions(-)
diff --git a/hai-bweb/src/main/java/com/bweb/controller/HighCouponController.java b/hai-bweb/src/main/java/com/bweb/controller/HighCouponController.java
index 787ad955..c4171277 100644
--- a/hai-bweb/src/main/java/com/bweb/controller/HighCouponController.java
+++ b/hai-bweb/src/main/java/com/bweb/controller/HighCouponController.java
@@ -596,6 +596,7 @@ public class HighCouponController {
// 查询电子卡券类型
JSONObject corpCouTypes = HuiLianTongConfig.getCorpCouTypes(tokenObject.getString("data"));
+ System.out.println(corpCouTypes.toJSONString());
if (!corpCouTypes.getString("result").equals("success")) {
log.error("HighCouponController -> insertCoupon() error!","获取电子卡券列表失败");
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "获取电子卡券列表失败");
diff --git a/hai-service/src/main/java/com/hai/common/security/DESUtil.java b/hai-service/src/main/java/com/hai/common/security/DESUtil.java
index 729eec1f..7d6df471 100644
--- a/hai-service/src/main/java/com/hai/common/security/DESUtil.java
+++ b/hai-service/src/main/java/com/hai/common/security/DESUtil.java
@@ -1,148 +1,173 @@
package com.hai.common.security;
+import java.io.*;
import java.security.Key;
import java.security.SecureRandom;
import java.security.Security;
-import javax.crypto.Cipher;
-import javax.crypto.KeyGenerator;
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
+import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
+import javax.crypto.spec.IvParameterSpec;
-import org.apache.commons.codec.binary.Base64;
+import java.util.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
+public class DESUtil {
-/**
- * DES安全编码组件
- *
- * @author wbw
- * @version 1.0
- */
-public abstract class DESUtil {
- static{
- Security.insertProviderAt(new BouncyCastleProvider(), 1);
- }
/**
- * 密钥算法
- * Java 6 只支持56bit密钥
- * Bouncy Castle 支持64bit密钥
+ * 偏移变量,固定占8位字节
*/
- public static final String KEY_ALGORITHM = "DES";
-
+ private final static String IV_PARAMETER = "12345678";
+ /**
+ * 密钥算法
+ */
+ private static final String ALGORITHM = "DES";
/**
- * 加密/解密算法 / 工作模式 / 填充方式
+ * 加密/解密算法-工作模式-填充模式
*/
- public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5PADDING";
+ private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
+ /**
+ * 默认编码
+ */
+ private static final String CHARSET = "utf-8";
/**
- * 转换密钥
+ * 生成key
*
- * @param key
- * 二进制密钥
- * @return Key 密钥
+ * @param password
+ * @return
* @throws Exception
*/
- private static Key toKey(byte[] key) throws Exception {
-
- // 实例化DES密钥材料
- DESKeySpec dks = new DESKeySpec(key);
-
- // 实例化秘密密钥工厂
- SecretKeyFactory keyFactory = SecretKeyFactory
- .getInstance(KEY_ALGORITHM);
-
- // 生成秘密密钥
- SecretKey secretKey = keyFactory.generateSecret(dks);
-
- return secretKey;
+ private static Key generateKey(String password) throws Exception {
+ DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET));
+ SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
+ return keyFactory.generateSecret(dks);
}
+
/**
- * 解密
+ * DES加密字符串
*
- * @param data
- * 待解密数据
- * @param key
- * 密钥
- * @return byte[] 解密数据
- * @throws Exception
+ * @param password 加密密码,长度不能够小于8位
+ * @param data 待加密字符串
+ * @return 加密后内容
*/
- public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
-
- // 还原密钥
- Key k = toKey(key);
-
- // 实例化
- Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
-
- // 初始化,设置为解密模式
- cipher.init(Cipher.DECRYPT_MODE, k);
-
- // 执行操作
- return cipher.doFinal(data);
+ public static String encrypt(String password, String data) {
+ if (password== null || password.length() < 8) {
+ throw new RuntimeException("加密失败,key不能小于8位");
+ }
+ if (data == null)
+ return null;
+ try {
+ Key secretKey = generateKey(password);
+ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
+ IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
+ cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
+ byte[] bytes = cipher.doFinal(data.getBytes(CHARSET));
+
+ //JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
+ //Android平台可以使用android.util.Base64
+ return new String(Base64.getEncoder().encode(bytes));
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return data;
+ }
}
/**
- * 加密
+ * DES解密字符串
*
- * @param data
- * 待加密数据
- * @param key
- * 密钥
- * @return byte[] 加密数据
- * @throws Exception
+ * @param password 解密密码,长度不能够小于8位
+ * @param data 待解密字符串
+ * @return 解密后内容
*/
- public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
-
- // 还原密钥
- Key k = toKey(key);
-
- // 实例化
- Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
-
- // 初始化,设置为加密模式
- cipher.init(Cipher.ENCRYPT_MODE, k);
-
- // 执行操作
- return cipher.doFinal(data);
+ public static String decrypt(String password, String data) {
+ if (password== null || password.length() < 8) {
+ throw new RuntimeException("加密失败,key不能小于8位");
+ }
+ if (data == null)
+ return null;
+ try {
+ Key secretKey = generateKey(password);
+ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
+ IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
+ cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
+ return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return data;
+ }
}
/**
- * 生成密钥
- * Java 6 只支持56bit密钥
- * Bouncy Castle 支持64bit密钥
+ * DES加密文件
*
- * @return byte[] 二进制密钥
- * @throws Exception
+ * @param srcFile 待加密的文件
+ * @param destFile 加密后存放的文件路径
+ * @return 加密后的文件路径
*/
- public static byte[] initKey() throws Exception {
-
- /*
- * 实例化密钥生成器
- *
- * 若要使用64bit密钥注意替换 将下述代码中的KeyGenerator.getInstance(CIPHER_ALGORITHM);
- * 替换为KeyGenerator.getInstance(CIPHER_ALGORITHM, "BC");
- */
- KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
-
- /*
- * 初始化密钥生成器 若要使用64bit密钥注意替换 将下述代码kg.init(56); 替换为kg.init(64);
- */
- kg.init(56, new SecureRandom());
+/* public static String encryptFile(String password, String srcFile, String destFile) {
+
+ if (password== null || password.length() < 8) {
+ throw new RuntimeException("加密失败,key不能小于8位");
+ }
+ try {
+ IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
+ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
+ cipher.init(Cipher.ENCRYPT_MODE, generateKey(key), iv);
+ InputStream is = new FileInputStream(srcFile);
+ OutputStream out = new FileOutputStream(destFile);
+ CipherInputStream cis = new CipherInputStream(is, cipher);
+ byte[] buffer = new byte[1024];
+ int r;
+ while ((r = cis.read(buffer)) > 0) {
+ out.write(buffer, 0, r);
+ }
+ cis.close();
+ is.close();
+ out.close();
+ return destFile;
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }*/
- // 生成秘密密钥
- SecretKey secretKey = kg.generateKey();
-
- // 获得密钥的二进制编码形式
- return secretKey.getEncoded();
- }
-
- public static byte[] initKey(String seed) throws Exception {
- KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
- SecureRandom secureRandom = new SecureRandom(new Base64().decode(seed));
- kg.init(secureRandom);
- SecretKey secretKey = kg.generateKey();
- return secretKey.getEncoded();
- }
-}
\ No newline at end of file
+ /**
+ * DES解密文件
+ *
+ * @param srcFile 已加密的文件
+ * @param destFile 解密后存放的文件路径
+ * @return 解密后的文件路径
+ */
+/* public static String decryptFile(String password, String srcFile, String destFile) {
+ if (password== null || password.length() < 8) {
+ throw new RuntimeException("加密失败,key不能小于8位");
+ }
+ try {
+ File file = new File(destFile);
+ if (!file.exists()) {
+ file.getParentFile().mkdirs();
+ file.createNewFile();
+ }
+ IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
+ Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
+ cipher.init(Cipher.DECRYPT_MODE, generateKey(key), iv);
+ InputStream is = new FileInputStream(srcFile);
+ OutputStream out = new FileOutputStream(destFile);
+ CipherOutputStream cos = new CipherOutputStream(out, cipher);
+ byte[] buffer = new byte[1024];
+ int r;
+ while ((r = is.read(buffer)) >= 0) {
+ cos.write(buffer, 0, r);
+ }
+ cos.close();
+ is.close();
+ out.close();
+ return destFile;
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }*/
+}
diff --git a/hai-service/src/main/java/com/hai/config/HuiLianTongUnionCardConfig.java b/hai-service/src/main/java/com/hai/config/HuiLianTongUnionCardConfig.java
index f60b621f..5f55d14e 100644
--- a/hai-service/src/main/java/com/hai/config/HuiLianTongUnionCardConfig.java
+++ b/hai-service/src/main/java/com/hai/config/HuiLianTongUnionCardConfig.java
@@ -7,6 +7,7 @@ import com.hai.common.utils.HttpsUtils;
import com.hai.common.utils.MD5Util;
import org.apache.commons.collections4.MapUtils;
+import java.nio.charset.Charset;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
@@ -33,12 +34,15 @@ public class HuiLianTongUnionCardConfig {
dataJson.put("userMobile", "17726395120");
System.out.println(JSONObject.toJSONString(dataJson));
- map.put("data", new String(DESUtil.encrypt(JSONObject.toJSONString(dataJson).getBytes(),signCode.getBytes()),"ISO8859-1"));
+ map.put("data", DESUtil.encrypt(signCode,JSONObject.toJSONString(dataJson)));
System.out.println(MapUtils.getString(map,"data"));
+
String str = (MapUtils.getString(map,"accessCode") + signCode) + (MapUtils.getString(map,"requestId") + signCode) + (MapUtils.getString(map,"method") + signCode) + (MapUtils.getString(map,"data") + signCode);
- map.put("sign", MD5Util.encode(str.getBytes()));
- // return HttpsUtils.doPost("http://hltgz.com:4010/api/v2/execute.json", JSON.toJSONString(map));
+ System.out.println(str);
+ map.put("sign", com.hai.common.pay.util.MD5Util.MD5Encode(str, "UTF-8").toUpperCase());
+ System.out.println(MapUtils.getString(map, "sign"));
+ //return HttpsUtils.doPost("http://hltgz.com:4010/api/v2/execute.json", JSON.toJSONString(map));
return null;
}