parent
9c6db53e13
commit
3a66e3f66c
20 changed files with 977 additions and 72 deletions
@ -0,0 +1,66 @@ |
|||||||
|
package com.daqing.financial.hrauth.handle; |
||||||
|
|
||||||
|
import com.daqing.financial.hrauth.model.ApiResult; |
||||||
|
import com.daqing.financial.hrauth.service.impl.UserDetailsServiceImpl; |
||||||
|
import com.daqing.financial.hrauth.util.ResponseUtils; |
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.apache.commons.lang3.StringUtils; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.http.MediaType; |
||||||
|
import org.springframework.security.access.AccessDeniedException; |
||||||
|
import org.springframework.security.web.access.AccessDeniedHandler; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import javax.servlet.ServletException; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* Security自定义异常处理类 |
||||||
|
* @Author: jialing xu |
||||||
|
* @Description: xvjialing@outlook.com |
||||||
|
* @Date: 17:24 2018/8/7 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
@Component |
||||||
|
public class CustomAccessDeniedHandler implements AccessDeniedHandler { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ObjectMapper objectMapper; |
||||||
|
|
||||||
|
private final UserDetailsServiceImpl userDetailsService; |
||||||
|
|
||||||
|
protected CustomAccessDeniedHandler(UserDetailsServiceImpl userDetailsService) { |
||||||
|
this.userDetailsService = userDetailsService; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException { |
||||||
|
/* log.error("Token异常处理来了~~~~"+accessDeniedException.getMessage()); |
||||||
|
response.setContentType("application/json;charset=UTF-8"); |
||||||
|
Map map = new HashMap(); |
||||||
|
map.put("code", "403"); |
||||||
|
map.put("msg", accessDeniedException.getMessage()); |
||||||
|
map.put("data",""); |
||||||
|
response.setContentType("application/json"); |
||||||
|
response.setStatus(HttpServletResponse.SC_OK); |
||||||
|
response.getWriter().write(objectMapper.writeValueAsString(map));*/ |
||||||
|
|
||||||
|
// ResponseUtils.out(response, ApiResult.fail(401, e.getMessage()));
|
||||||
|
String token = request.getHeader("token"); |
||||||
|
if (StringUtils.isNotBlank(token)) { |
||||||
|
// 检查token
|
||||||
|
SecurityUser securityUser = userDetailsService.getUserByToken(token); |
||||||
|
if (securityUser == null || securityUser.getCurrentUserInfo() == null) { |
||||||
|
//ExceptionCast.cast(HrmsCode.TOKEN_EXCEPTION);
|
||||||
|
throw new AccessDeniedException("TOKEN已过期,请重新登录~~~"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,73 @@ |
|||||||
|
package com.daqing.financial.hrauth.util; |
||||||
|
|
||||||
|
import java.security.AlgorithmParameters; |
||||||
|
import java.security.InvalidAlgorithmParameterException; |
||||||
|
import java.security.InvalidKeyException; |
||||||
|
import java.security.Key; |
||||||
|
import java.security.NoSuchAlgorithmException; |
||||||
|
import java.security.NoSuchProviderException; |
||||||
|
import java.security.Security; |
||||||
|
|
||||||
|
import javax.crypto.BadPaddingException; |
||||||
|
import javax.crypto.Cipher; |
||||||
|
import javax.crypto.IllegalBlockSizeException; |
||||||
|
import javax.crypto.NoSuchPaddingException; |
||||||
|
import javax.crypto.spec.IvParameterSpec; |
||||||
|
import javax.crypto.spec.SecretKeySpec; |
||||||
|
|
||||||
|
import org.bouncycastle.jce.provider.BouncyCastleProvider; |
||||||
|
|
||||||
|
public class AES { |
||||||
|
public static boolean initialized = false; |
||||||
|
|
||||||
|
/** |
||||||
|
* AES对称解密工具类 |
||||||
|
* |
||||||
|
* @param content |
||||||
|
* 密文 |
||||||
|
* @return |
||||||
|
* @throws InvalidAlgorithmParameterException |
||||||
|
* @throws NoSuchProviderException |
||||||
|
*/ |
||||||
|
public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException { |
||||||
|
initialize(); |
||||||
|
try { |
||||||
|
// java是没有
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); |
||||||
|
Key sKeySpec = new SecretKeySpec(keyByte, "AES"); |
||||||
|
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
|
||||||
|
byte[] result = cipher.doFinal(content); |
||||||
|
return result; |
||||||
|
} catch (NoSuchAlgorithmException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (NoSuchPaddingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (InvalidKeyException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (IllegalBlockSizeException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (BadPaddingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (NoSuchProviderException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public static void initialize() { |
||||||
|
if (initialized) |
||||||
|
return; |
||||||
|
Security.addProvider(new BouncyCastleProvider()); |
||||||
|
initialized = true; |
||||||
|
} |
||||||
|
|
||||||
|
// 生成iv
|
||||||
|
public static AlgorithmParameters generateIV(byte[] iv) throws Exception { |
||||||
|
AlgorithmParameters params = AlgorithmParameters.getInstance("AES"); |
||||||
|
params.init(new IvParameterSpec(iv)); |
||||||
|
return params; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
package com.daqing.financial.hrauth.util; |
||||||
|
/** |
||||||
|
* 对公众平台发送给公众账号的消息加解密示例代码. |
||||||
|
* |
||||||
|
* @copyright Copyright (c) 1998-2014 Tencent Inc. |
||||||
|
*/ |
||||||
|
|
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.util.Arrays; |
||||||
|
|
||||||
|
/** |
||||||
|
* 提供基于PKCS7算法的加解 |
||||||
|
*/ |
||||||
|
public class PKCS7Encoder { |
||||||
|
|
||||||
|
private static final Charset CHARSET = Charset.forName("utf-8"); |
||||||
|
private static final int BLOCK_SIZE = 32; |
||||||
|
|
||||||
|
/** |
||||||
|
* 获得对明文进行补位填充的字节. |
||||||
|
* |
||||||
|
* @param count 需要进行填充补位操作的明文字节个数 |
||||||
|
* @return 补齐用的字节数组 |
||||||
|
*/ |
||||||
|
public static byte[] encode(int count) { |
||||||
|
// 计算需要填充的位数
|
||||||
|
int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); |
||||||
|
if (amountToPad == 0) { |
||||||
|
amountToPad = BLOCK_SIZE; |
||||||
|
} |
||||||
|
// 获得补位所用的字符
|
||||||
|
char padChr = chr(amountToPad); |
||||||
|
String tmp = new String(); |
||||||
|
for (int index = 0; index < amountToPad; index++) { |
||||||
|
tmp += padChr; |
||||||
|
} |
||||||
|
return tmp.getBytes(CHARSET); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除解密后明文的补位字符 |
||||||
|
* |
||||||
|
* @param decrypted 解密后的明文 |
||||||
|
* @return 删除补位字符后的明文 |
||||||
|
*/ |
||||||
|
public static byte[] decode(byte[] decrypted) { |
||||||
|
int pad = decrypted[decrypted.length - 1]; |
||||||
|
if (pad < 1 || pad > 32) { |
||||||
|
pad = 0; |
||||||
|
} |
||||||
|
return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将数字转化成ASCII码对应的字符,用于对明文进行补码 |
||||||
|
* |
||||||
|
* @param a 需要转化的数字 |
||||||
|
* @return 转化得到的字符 |
||||||
|
*/ |
||||||
|
public static char chr(int a) { |
||||||
|
byte target = (byte) (a & 0xFF); |
||||||
|
return (char) target; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,198 @@ |
|||||||
|
package com.daqing.financial.hrauth.util; |
||||||
|
|
||||||
|
import com.google.common.primitives.Bytes; |
||||||
|
import org.apache.commons.codec.binary.Base64; |
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
import java.security.InvalidAlgorithmParameterException; |
||||||
|
import java.security.InvalidKeyException; |
||||||
|
import java.security.NoSuchAlgorithmException; |
||||||
|
import java.security.SecureRandom; |
||||||
|
|
||||||
|
import javax.crypto.BadPaddingException; |
||||||
|
import javax.crypto.Cipher; |
||||||
|
import javax.crypto.IllegalBlockSizeException; |
||||||
|
import javax.crypto.KeyGenerator; |
||||||
|
import javax.crypto.NoSuchPaddingException; |
||||||
|
import javax.crypto.SecretKey; |
||||||
|
import javax.crypto.spec.SecretKeySpec; |
||||||
|
|
||||||
|
public class TestUtil { |
||||||
|
/** |
||||||
|
* 加密 |
||||||
|
* |
||||||
|
* @param content |
||||||
|
* 需要加密的内容 |
||||||
|
* @param password |
||||||
|
* 加密密码 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static byte[] encrypt(String content, String password) { |
||||||
|
try { |
||||||
|
KeyGenerator kgen = KeyGenerator.getInstance("AES"); |
||||||
|
kgen.init(128, new SecureRandom(password.getBytes())); |
||||||
|
SecretKey secretKey = kgen.generateKey(); |
||||||
|
byte[] enCodeFormat = secretKey.getEncoded(); |
||||||
|
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 (NoSuchAlgorithmException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (NoSuchPaddingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (InvalidKeyException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (IllegalBlockSizeException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (BadPaddingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 解密 |
||||||
|
* |
||||||
|
* @param content |
||||||
|
* 待解密内容 |
||||||
|
* @param password |
||||||
|
* 解密密钥 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static byte[] decrypt(byte[] content, String password) { |
||||||
|
try { |
||||||
|
KeyGenerator kgen = KeyGenerator.getInstance("AES"); |
||||||
|
kgen.init(128, new SecureRandom(password.getBytes())); |
||||||
|
SecretKey secretKey = kgen.generateKey(); |
||||||
|
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 (NoSuchAlgorithmException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (NoSuchPaddingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (InvalidKeyException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (IllegalBlockSizeException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (BadPaddingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将二进制转换成16进制 |
||||||
|
* |
||||||
|
* @param buf |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public 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(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将16进制转换为二进制 |
||||||
|
* |
||||||
|
* @param hexStr |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public 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 content |
||||||
|
* 需要加密的内容 |
||||||
|
* @param password |
||||||
|
* 加密密码 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static byte[] encrypt2(String content, String password) { |
||||||
|
try { |
||||||
|
SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES"); |
||||||
|
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); |
||||||
|
byte[] byteContent = content.getBytes("utf-8"); |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
|
||||||
|
byte[] result = cipher.doFinal(byteContent); |
||||||
|
return result; // 加密
|
||||||
|
} catch (NoSuchAlgorithmException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (NoSuchPaddingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (InvalidKeyException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (IllegalBlockSizeException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (BadPaddingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) throws UnsupportedEncodingException, InvalidAlgorithmParameterException { |
||||||
|
String encryptedData="+WQuaG5Tr9EU6f+Cx7OR7O8/HbVAUK77P9/BRqhdA4qYKLcw0sbS1R5DfoU+D4HEpoUCXtmRH/gP" + |
||||||
|
"eJqYFJpauBysbadiYrZ6wYWjp5wP+HgxWnfCOk7jwR8WUdvFFDuQMhAVudnFhhNP3g4iHfCeiU5yfmN4iw" + |
||||||
|
"gpL4txJpuZDHhyjqBqGGxntyxgxHFonbFi94e+IaPrFqigvqJXI9RGW9eXUVhZEQGeadv+eW72ucPq90KGH" + |
||||||
|
"wPj0uUMWRWPJC8ZWp+uRUbrENiKfo9QJqiMljq/wcbz4c/u/Wd7PF4o4s02uutMjsrpYdnpw20E7DDpUIBU" + |
||||||
|
"fIkeDmIFOIEQYPAGbTFtbHwPyyrx/r+fSihmO6PRwAlUrfhCOZ3KNkmtqZPDjqfHGrW+MeiquW5vryXL8FWy++z" + |
||||||
|
"OVdGzymGvW6E/hSVDoTNL4+zeuxhJAXCnuPjLtYeL0EkGam8ks0KDqhZy3gUwRwrM0HFzQ1IryTMsqeLCcLMm" + |
||||||
|
"0vWG4PEuPv5j5+V66MTGYvyyM2v67zK7Z2cn2A=="; |
||||||
|
String iv="zI+P8RVxEwMFBXcJDCemHg=="; |
||||||
|
String session_key="Piqc8iFe6pN0i5ofq4Y6PA=="; |
||||||
|
|
||||||
|
String content = encryptedData; |
||||||
|
String password = ""; |
||||||
|
// 加密
|
||||||
|
System.out.println("加密前:" + content); |
||||||
|
byte[] encode = encrypt(content, password); |
||||||
|
|
||||||
|
//传输过程,不转成16进制的字符串,就等着程序崩溃掉吧
|
||||||
|
String code = parseByte2HexStr(encode); |
||||||
|
System.out.println("密文字符串:" + code); |
||||||
|
byte[] decode = parseHexStr2Byte(code); |
||||||
|
// 解密
|
||||||
|
byte[] decryptResult = decrypt(decode, password); |
||||||
|
System.out.println("decryptResult==="+decryptResult); |
||||||
|
System.out.println("解密后:" + new String(decryptResult, "UTF-8")); //不转码会乱码
|
||||||
|
System.out.println("========================================================="); |
||||||
|
|
||||||
|
byte[] dataByte = Base64.decodeBase64(session_key); |
||||||
|
//byte[] d = TestUtil.parseHexStr2Byte(encryptedData);
|
||||||
|
byte[] dr = decrypt(dataByte, ""); |
||||||
|
//String re = new String(dr, "UTF-8");
|
||||||
|
//System.out.println("result====="+re);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,115 @@ |
|||||||
|
package com.daqing.financial.hrauth.util; |
||||||
|
import javax.crypto.Cipher; |
||||||
|
import javax.crypto.spec.IvParameterSpec; |
||||||
|
import javax.crypto.spec.SecretKeySpec; |
||||||
|
|
||||||
|
import sun.misc.BASE64Decoder; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
|
||||||
|
/** |
||||||
|
* 对微信小程序用户加密数据的解密示例代码. |
||||||
|
* |
||||||
|
* @ClassName WXBizDataCrypt |
||||||
|
* @Description TODO(这里用一句话描述这个类的作用) |
||||||
|
* @author tf |
||||||
|
* @Date 2016年11月19日 下午2:56:36 |
||||||
|
* @version 1.0.0 |
||||||
|
*/ |
||||||
|
@SuppressWarnings("restriction") |
||||||
|
public class WXBizDataCrypt { |
||||||
|
/* |
||||||
|
* 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。 |
||||||
|
*/ |
||||||
|
private static WXBizDataCrypt instance = null; |
||||||
|
|
||||||
|
private WXBizDataCrypt() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public static WXBizDataCrypt getInstance() { |
||||||
|
if (instance == null) |
||||||
|
instance = new WXBizDataCrypt(); |
||||||
|
return instance; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 对于官方加密数据(encryptData)解密说明如下: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 |
||||||
|
* openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( |
||||||
|
* encryptedData )进行对称解密。 解密算法如下: 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。 |
||||||
|
* 对称解密的目标密文为 Base64_Decode(encryptedData), 对称解密秘钥 aeskey = |
||||||
|
* Base64_Decode(session_key), aeskey 是16字节 对称解密算法初始向量 iv 会在数据接口中返回。 |
||||||
|
* |
||||||
|
* @Description (TODO这里用一句话描述这个方法的作用) |
||||||
|
* @param encryptedData |
||||||
|
* 加密内容 |
||||||
|
* @param sessionKey |
||||||
|
* 小程序登录sessionKey |
||||||
|
* @param iv |
||||||
|
* 解密算法初始向量 iv 会在数据接口中返回。 |
||||||
|
* @param encodingFormat |
||||||
|
* 编码格式默认UTF-8 |
||||||
|
* @return 返回解密后的字符串 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { |
||||||
|
try { |
||||||
|
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); |
||||||
|
BASE64Decoder base64Decoder = new BASE64Decoder(); |
||||||
|
byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData); |
||||||
|
byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey); |
||||||
|
byte[] _iv = base64Decoder.decodeBuffer(iv); |
||||||
|
SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES"); |
||||||
|
IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv); |
||||||
|
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); |
||||||
|
byte[] original = cipher.doFinal(_encryptedData); |
||||||
|
byte[] bytes = PKCS7Encoder.decode(original); |
||||||
|
String originalString = new String(bytes, "ISO-8859-1"); |
||||||
|
return originalString; |
||||||
|
} catch (Exception ex) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception { |
||||||
|
// 需要加密的字串
|
||||||
|
// String appid = "wx4f4bc4dec97d474b";
|
||||||
|
/* String sessionKey = "tiihtNczf5v6AKRyjwEUhQ=="; |
||||||
|
|
||||||
|
String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM" + "QmRzooG2xrDcvSnxIMXFufNstNGTyaGS" |
||||||
|
+ "9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+" + "3hVbJSRgv+4lGOETKUQz6OYStslQ142d" |
||||||
|
+ "NCuabNPGBzlooOmB231qMM85d2/fV6Ch" + "evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6" |
||||||
|
+ "/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw" + "u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn" |
||||||
|
+ "/Hz7saL8xz+W//FRAUid1OksQaQx4CMs" + "8LOddcQhULW4ucetDf96JcR3g0gfRK4P" |
||||||
|
+ "C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB" + "6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns" |
||||||
|
+ "/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd" + "lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV" |
||||||
|
+ "oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG" + "20f0a04COwfneQAGGwd5oa+T8yO5hzuy" + "Db/XcxxmK01EpqOyuxINew=="; |
||||||
|
|
||||||
|
String iv = "r7BXXKkLb8qrSNn05n0qiA==";*/ |
||||||
|
|
||||||
|
/* String encryptedData="+WQuaG5Tr9EU6f+Cx7OR7O8/HbVAUK77P9/BRqhdA4qYKLcw0sbS1R5DfoU+D4HEpoUCXtmRH/gP" + |
||||||
|
"eJqYFJpauBysbadiYrZ6wYWjp5wP+HgxWnfCOk7jwR8WUdvFFDuQMhAVudnFhhNP3g4iHfCeiU5yfmN4iw" + |
||||||
|
"gpL4txJpuZDHhyjqBqGGxntyxgxHFonbFi94e+IaPrFqigvqJXI9RGW9eXUVhZEQGeadv+eW72ucPq90KGH" + |
||||||
|
"wPj0uUMWRWPJC8ZWp+uRUbrENiKfo9QJqiMljq/wcbz4c/u/Wd7PF4o4s02uutMjsrpYdnpw20E7DDpUIBU" + |
||||||
|
"fIkeDmIFOIEQYPAGbTFtbHwPyyrx/r+fSihmO6PRwAlUrfhCOZ3KNkmtqZPDjqfHGrW+MeiquW5vryXL8FWy++z" + |
||||||
|
"OVdGzymGvW6E/hSVDoTNL4+zeuxhJAXCnuPjLtYeL0EkGam8ks0KDqhZy3gUwRwrM0HFzQ1IryTMsqeLCcLMm" + |
||||||
|
"0vWG4PEuPv5j5+V66MTGYvyyM2v67zK7Z2cn2A=="; |
||||||
|
String iv="zI+P8RVxEwMFBXcJDCemHg=="; |
||||||
|
String sessionKey="Piqc8iFe6pN0i5ofq4Y6PA==";*/ |
||||||
|
|
||||||
|
String iv="Y37DfoP3+4ysUBo8YOnfiQ=="; |
||||||
|
String sessionKey="Piqc8iFe6pN0i5ofq4Y6PA=="; |
||||||
|
String encryptedData="V6E2hVgfhatfPt/octP4c6881lJ1GCsYqtzY9MzqlWTpthAw5uWJLpRoXtmO5oM7XSHS6xKqh8YVzhKmrfzbb66574fbfE7n5ADSJYlsJwem1ifm3sypW9Ys3GSBwHaQ/x+Sn3rfs+HKMJgegGn+b3R5X7eXFhrA6lFnd+/xpYB4VWztFMsIyVT85Mlv5G3vp1FryctiGjWTFDDh1kAFXQ31Cso91SuAW2muSUaHh32pJ+WBrpZ7wrEZyyuqMqA0UpZve+gonUpZjnRWXewTTWm6jvc7lMQqFA1PD13pOGKYNKD/WxtaMXPWmvN+5WVwScH7ueEeppA1/aFwsMGnDBUU/+B04WxuQxo+M4b15vIq5GxI5Qvulv1taRdA5oiI10K+9UJAm+dz/2c2ZqEIiu+QTj9gvgbJsrIWMe0Wu5qmNTj/V97furJlcVaVvJvUy0N8zrqb7unAptjL0bQUvIB0ZXVgNbGEZLmAbpQhNgpIJ0ft6LiqvIzkrRYR+sIVr+mJrCoYxhyxB8cqsHJT2w=="; |
||||||
|
|
||||||
|
/* String iv="sAUv8qjwP8j/Ql9KLgA4iQ=="; |
||||||
|
String sessionKey="H5lUk3IPIIENRdLxzLi2Hg=="; |
||||||
|
String encryptedData="QygyXroVw0DNuwO4mlZDBX9wy8XYYE+AA0D738aAKe4icD9UPhtFywJ49UbmT7syv+fb4cn+3ao/w0aQCceh/dEsUhdSWsqAQZtaaXGeCHzi1iGdznIVD06ZYUdgZrJ7rY8Ie9w5/SYVSdSn5pyGovNCohUW4fp2CVowzwrRydsngDDWYjutkSfdvKgT19sCwuOOqZTzDM3gRqIUxwfrjKaDaoCPfa6z+otC0F/BtZYiiqd3MQIMJ0+JSll3ZVrpQKitBhc1EydxN3WSayxhYc4fiEa0YHoXaci0C/6bAfedgGQhejK6hSPLXr/TC++I0lfWnCS/2aidIsifLfyNg2/84yc5mWY5snoc9QeyAoXHczL62n1RwGBetE1Sq7q/sRn9XOFvM0kJ6UOS0n3FvMrH7716hBjUIP/lIf7hAH2IBbnPWyk5iKrMYt/T1Ky5e+RjBwnqJCyYTAxrvEczj2IQPwpGS3B3KWNTGGaK42Sf07w6ID37J3bWsPDAllZUSDhm67vmUjH8AyPTPsGPOg=="; |
||||||
|
*/ |
||||||
|
|
||||||
|
/* String iv="amXf/b7Ollz6WV6e9ZCosg=="; |
||||||
|
String sessionKey="H8d5dQnmec8Wtm1Ac1IaxQ=="; |
||||||
|
String encryptedData="/xY631in/VQwauJfAsB9gGH8XpFAzZUprSYBoZzfbDbx60xsBpaikxnn1K+00MMzZ9hAVV4RRKRp+4qaoj+iSuJArgKlZByXaPQa4TxV7JGEuAA2qByTNHK/H2hrFdAxEDERwk7DjYqq1OhMO5n4pTRPxVUZ5ovKm81oOxVw77TjfkkQlgd2Uab/Oe7eM59HkoDQQDC9H2f4q7KmX7sHUuUWmMhEa8+rsJBMy2CWfTvfJpKE9BqNuNOHrXILMpvNm4vKcsc5DB6QzjbwJq8BLCLbmcE3Fa4ZQzcVW2Zi5lT0sOMX/kytgaceo/Rw3VpLkBwwRTsZDB7p+KRUbJYG7f3iSMWYveH09vL8dU+s9ZRO1FCgkyOj5jcpRAKEUAT2njdK4ozXYu+/qMUPeCp00G1NNlDq7gvBnhzYbQzg4+InTmENDYlckAIktBxa3ENWpDjiYWHBSHwbA/gJpAKoZz/oNUrBnPIH91UqRjGQXhdVnBQxeyMcnPuVrk3D51r5Ki3aAuwvB1l6+TWA//RcjTfSQtQnJ/yFctMmk3A7OGo="; |
||||||
|
*/String deString = WXBizDataCrypt.getInstance().decrypt(encryptedData, sessionKey, iv, "utf-8"); |
||||||
|
JSONObject jsonObject = JSONObject.parseObject(deString); |
||||||
|
System.out.println(jsonObject); |
||||||
|
} |
||||||
|
} |
@ -1,34 +1,132 @@ |
|||||||
package com.daqing.financial.hrauth; |
package com.daqing.financial.hrauth; |
||||||
|
|
||||||
import com.daqing.financial.hrauth.util.AesCbcUtil; |
import com.daqing.financial.hrauth.util.AesCbcUtil; |
||||||
import org.junit.Test; |
import io.swagger.models.auth.In; |
||||||
import org.springframework.boot.test.context.SpringBootTest; |
|
||||||
|
|
||||||
/*@SpringBootTest |
import java.io.BufferedReader; |
||||||
class DqFinancialHrmsAuthApplicationTests { |
import java.io.FileNotFoundException; |
||||||
|
import java.io.FileReader; |
||||||
|
import java.util.*; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
import java.util.stream.Stream; |
||||||
|
|
||||||
@Test |
class DqFinancialHrmsAuthApplicationTests{ |
||||||
void contextLoads() throws Exception { |
public static void main(String[] args) throws Exception { |
||||||
|
String encryptedData="+WQuaG5Tr9EU6f+Cx7OR7O8/HbVAUK77P9/BRqhdA4qYKLcw0sbS1R5DfoU+D4HEpoUCXtmRH/gPeJqYFJpauBysbadiYrZ6wYWjp5wP+HgxWnfCOk7jwR8WUdvFFDuQMhAVudnFhhNP3g4iHfCeiU5yfmN4iwgpL4txJpuZDHhyjqBqGGxntyxgxHFonbFi94e+IaPrFqigvqJXI9RGW9eXUVhZEQGeadv+eW72ucPq90KGHwPj0uUMWRWPJC8ZWp+uRUbrENiKfo9QJqiMljq/wcbz4c/u/Wd7PF4o4s02uutMjsrpYdnpw20E7DDpUIBUfIkeDmIFOIEQYPAGbTFtbHwPyyrx/r+fSihmO6PRwAlUrfhCOZ3KNkmtqZPDjqfHGrW+MeiquW5vryXL8FWy++zOVdGzymGvW6E/hSVDoTNL4+zeuxhJAXCnuPjLtYeL0EkGam8ks0KDqhZy3gUwRwrM0HFzQ1IryTMsqeLCcLMm0vWG4PEuPv5j5+V66MTGYvyyM2v67zK7Z2cn2A=="; |
||||||
String encryptedData="m7CF698f222KiEse8aFLIwSiXjxojbFesVpHltvrKPqKH3OclT7Qc+UhOw+MbxRAOSKgMb+erVYXYcrPwQ6TSF4VBt9Lzv0GdxJf82876SgANFURjVZBXKSwp0snxw/9wdfTGV2t7nIbpbUfBFD0QEi4rrsD8hZdPr4s/WLtHcpcvRkJvb3KDRw+PsnTyBtFOnXnv5sOJW84uy9OGuTTV8s0miqZCy//xZU2DJ3EZsg3Rp9E5xe0jMLtLOfvQEf5tM/pPw9hCkWbbBJEBSUn5IkSgkt3jAasjoWOSuDzw+MAJvnT7byJ7bvOSbEY14RAZzX6sZYw8Rd/n9fOssZivfF+F2HIfHhWuBNcGhNYTIYXtJsvmhtT5Wo4mMnq0j/TElZOoAjc385xkluHNRB/T+PVo+FEkRZgiugAOzOPn24WjZU7nbPrtoEYH5Bcdfcf3quP4hQAIQd6EvkfdnRti+Mfn925llWSS+fa+AV3hx0mwtFkk1VFMBuLPjL2nvvvUl4NkoMVzw0NRGPpeiS+DA=="; |
String iv="zI+P8RVxEwMFBXcJDCemHg=="; |
||||||
String iv="jh3Io5uYeMSbU903QXpewA=="; |
String session_key="Piqc8iFe6pN0i5ofq4Y6PA=="; |
||||||
String session_key="LKv54UbAoCTx4yz5mi6S1A=="; |
|
||||||
|
|
||||||
|
|
||||||
String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8"); |
/* String result = AesCbcUtil.decrypt2(session_key,encryptedData,iv); |
||||||
|
String s2 = new String(result.getBytes("UTF-8"),"GBK"); |
||||||
System.out.println(result); |
System.out.println(result); |
||||||
|
System.out.println(s2);*/ |
||||||
} |
} |
||||||
|
|
||||||
}*/ |
/* public static void main(String[] args) { |
||||||
|
//=================================流的常用创建方法=======================================
|
||||||
|
//1,使用Collection下的stream()和parallelStream()操作
|
||||||
|
List<String> list = new ArrayList(); |
||||||
|
Stream<String> stream = list.stream();//获取一个顺序流
|
||||||
|
Stream<String> parallelStream = list.parallelStream();//获取一个并行流
|
||||||
|
|
||||||
class DqFinancialHrmsAuthApplicationTests{ |
//2,使用Arrays中的stream()方法,将数组转成流
|
||||||
public static void main(String[] args) throws Exception { |
Integer[]num = new Integer[10]; |
||||||
String encryptedData="m7CF698f222KiEse8aFLIwSiXjxojbFesVpHltvrKPqKH3OclT7Qc+UhOw+MbxRAOSKgMb+erVYXYcrPwQ6TSF4VBt9Lzv0GdxJf82876SgANFURjVZBXKSwp0snxw/9wdfTGV2t7nIbpbUfBFD0QEi4rrsD8hZdPr4s/WLtHcpcvRkJvb3KDRw+PsnTyBtFOnXnv5sOJW84uy9OGuTTV8s0miqZCy//xZU2DJ3EZsg3Rp9E5xe0jMLtLOfvQEf5tM/pPw9hCkWbbBJEBSUn5IkSgkt3jAasjoWOSuDzw+MAJvnT7byJ7bvOSbEY14RAZzX6sZYw8Rd/n9fOssZivfF+F2HIfHhWuBNcGhNYTIYXtJsvmhtT5Wo4mMnq0j/TElZOoAjc385xkluHNRB/T+PVo+FEkRZgiugAOzOPn24WjZU7nbPrtoEYH5Bcdfcf3quP4hQAIQd6EvkfdnRti+Mfn925llWSS+fa+AV3hx0mwtFkk1VFMBuLPjL2nvvvUl4NkoMVzw0NRGPpeiS+DA=="; |
Stream<Integer> stream1 = Arrays.stream(num); |
||||||
String iv="jh3Io5uYeMSbU903QXpewA=="; |
//System.out.println("stream1==="+stream1);
|
||||||
String session_key="LKv54UbAoCTx4yz5mi6S1A=="; |
|
||||||
|
|
||||||
|
//3,使用Stream中的静态方法:如of(),iterate(),generate()
|
||||||
|
Stream<Integer>stream2 = Stream.of(1,2,3,4,5,6); |
||||||
|
//stream2.forEach(System.out::println);
|
||||||
|
//stream2.forEach((t)->System.out.println(t));每次创建的stream只能使用一次,否则报错stream has already been operated upon or closed
|
||||||
|
|
||||||
String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8"); |
Stream<Integer>stream3 = Stream.iterate(0,(x)->x+2).limit(8); |
||||||
System.out.println(result); |
//stream3.forEach(System.out::println);
|
||||||
|
|
||||||
|
Stream<Double>stream4 = Stream.generate(Math::random).limit(2); |
||||||
|
// stream4.forEach((t)->System.out.println(t));
|
||||||
|
|
||||||
|
//4,使用BufferedReader.lines()方法,将每行内容转成流
|
||||||
|
BufferedReader reader=null; |
||||||
|
try { |
||||||
|
reader = new BufferedReader(new FileReader("D:\\myfile\\工作文档.txt")); |
||||||
|
} catch (FileNotFoundException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
Stream<String>lineStream = reader.lines(); |
||||||
|
//lineStream.forEach(System.out::println);
|
||||||
|
|
||||||
|
//5,使用Pattern.splitAsStream()方法,将字符串分隔成流
|
||||||
|
Pattern pattern = Pattern.compile(","); |
||||||
|
Stream<String> stream5 = pattern.splitAsStream("漆柒,菜园子"); |
||||||
|
// stream5.forEach(System.out::println);
|
||||||
|
|
||||||
|
//=================================流的中间操作========================================
|
||||||
|
//1,筛选与切片
|
||||||
|
Stream<Integer> stream6 = Stream.of(6, 4, 6, 7, 3, 9, 8, 10, 12, 14, 14, 20, 3); |
||||||
|
Stream<Integer> newStream = stream6.filter(t -> t>5)//6, 6, 7, 9, 8, 10, 12, 14, 14, 20
|
||||||
|
.distinct()//6, 7, 9, 8, 10, 12, 14, 20
|
||||||
|
.skip(2)//9, 8, 10, 12, 14, 20
|
||||||
|
.limit(5);//9, 8, 10, 12, 14
|
||||||
|
//filter:过滤流中的某些元素,limit(n):获取n个元素,skip(n):跳过n元素,配合limit(n)可做分页,distinct:通过流中元素的hashCode()和equals()去重
|
||||||
|
// newStream.forEach(System.out::println);
|
||||||
|
|
||||||
|
//2,映射
|
||||||
|
List<String> list2 = Arrays.asList("a,b,c", "1,2,3"); |
||||||
|
//将每个元素转成一个新的且不带括号的元素
|
||||||
|
Stream<String> streamMap = list2.stream().map(s->s.replaceAll(",","")); |
||||||
|
// streamMap.forEach(System.out::println);
|
||||||
|
|
||||||
|
Stream<String> streamFlatMap = list2.stream().flatMap(s->{ |
||||||
|
//将每个元素转换成一个Stream流
|
||||||
|
String[]split = s.split(","); |
||||||
|
Stream<String>ss = Arrays.stream(split); |
||||||
|
return ss; |
||||||
|
}); |
||||||
|
// streamFlatMap.forEach(System.out::println);
|
||||||
|
|
||||||
|
//3,排序
|
||||||
|
List<String>list3=Arrays.asList("az","fb","de"); |
||||||
|
Stream<String>stream7 = list3.stream().sorted(); |
||||||
|
// stream7.forEach(System.out::println);
|
||||||
|
|
||||||
|
Student s1 = new Student("aa",10); |
||||||
|
Student s2 = new Student("bb",20); |
||||||
|
Student s3 = new Student("aa",30); |
||||||
|
Student s4 = new Student("dd",40); |
||||||
|
List<Student>pojoList = Arrays.asList(s1,s2,s3,s4); |
||||||
|
|
||||||
|
//自定义排序,先按姓名升序,姓名相同的按年龄升序
|
||||||
|
//jdk8新操作
|
||||||
|
pojoList.stream().sorted( |
||||||
|
(o1,o2)->{ |
||||||
|
if(o1.getName().equals(o2.getName())){ |
||||||
|
return o1.getAge()-o2.getAge(); |
||||||
|
}else{ |
||||||
|
return o1.getName().compareTo(o2.getName()); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
//jdk7骚操作
|
||||||
|
Collections.sort(pojoList, new Comparator<Student>() { |
||||||
|
@Override |
||||||
|
public int compare(Student o1, Student o2) { |
||||||
|
if(o1.getName().equals(o2.getName())){ |
||||||
|
return o1.getAge()-o2.getAge(); |
||||||
|
}else{ |
||||||
|
return o1.getName().compareTo(o2.getName()); |
||||||
} |
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
//4,消费 peek
|
||||||
|
List<Student> studentList = Arrays.asList(s1,s2); |
||||||
|
studentList.stream().peek(s->s.setAge(100)); |
||||||
|
|
||||||
|
//===================================流的终止操作=====================================
|
||||||
|
//1,匹配,聚合操作
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}*/ |
||||||
} |
} |
@ -0,0 +1,41 @@ |
|||||||
|
package com.daqing.financial.hrauth; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* 记录部门信息 |
||||||
|
* |
||||||
|
* @author gongsj |
||||||
|
* @email gongsj@gmail.com |
||||||
|
* @date 2020-09-07 17:12:14 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class Student implements Serializable { |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
public Student(String name, Integer age) { |
||||||
|
this.name = name; |
||||||
|
this.age = age; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 主键 |
||||||
|
*/ |
||||||
|
@TableId(value = "id", type = IdType.AUTO) |
||||||
|
private Long id; |
||||||
|
/** |
||||||
|
* 部门名称 |
||||||
|
*/ |
||||||
|
@ApiModelProperty(value = "部门名称") |
||||||
|
private String name; |
||||||
|
/** |
||||||
|
* 上级部门id |
||||||
|
*/ |
||||||
|
private Integer age; |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue