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; }