微信小程序encryptedData解密工具类

微信小程序开发,很多情况都会使用openid,另外小程序关联公众号使用公众号模板消息做消息提示时,由于此时的unionid是一致的,可以通过微信小程序的unionid间接获取到公众号模板消息发送时需要使用到的openid,所以,unionid也同样经常获取。但是微信小程序调用getUserinfo接口的时候,不会直接返回openid以及unionid,这些私密的信息一般会保存在加密字段encryptedData中,如果想要获取需要对encryptedData数据进行解密,这里提供一个后台解密工具类,可供大家方便微信小程序encryptedData数据的解密,工具类如下:

// 算法名
    public static final String KEY_NAME = "AES";
    // 加解密算法/模式/填充方式
    // ECB模式只用密钥即可对数据进行加密解密,CBC模式需要添加一个iv
    public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";

    /**
     * 微信 数据解密
* 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
* 对称解密的目标密文:encrypted=Base64_Decode(encryptData)
* 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节
* 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节
* * @param encrypted 目标密文 * @param session_key 会话ID * @param iv 加密算法的初始向量 */ public static String wxDecrypt(String encrypted, String session_key, String iv) { String json = null; byte[] encrypted64 = Base64.decodeBase64(encrypted); byte[] key64 = Base64.decodeBase64(session_key); byte[] iv64 = Base64.decodeBase64(iv); byte[] data; try { init(); json = new String(decrypt(encrypted64, key64, generateIV(iv64))); } catch (Exception e) { e.printStackTrace(); } return json; } /** * 初始化密钥 */ public static void init() throws Exception { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); KeyGenerator.getInstance(KEY_NAME).init(128); } /** * 生成iv */ public static AlgorithmParameters generateIV(byte[] iv) throws Exception { // iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0 // Arrays.fill(iv, (byte) 0x00); AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_NAME); params.init(new IvParameterSpec(iv)); return params; } /** * 生成解密 */ public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes, AlgorithmParameters iv) throws Exception { Key key = new SecretKeySpec(keyBytes, KEY_NAME); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); // 设置为解密模式 cipher.init(Cipher.DECRYPT_MODE, key, iv); return cipher.doFinal(encryptedData); } /** * 微信小程序解密 * @param encryptedData * @param sessionKey * @param iv * @return */ public static String getUserInfo(String encryptedData, String sessionKey, String iv) { String result = ""; // 被加密的数据 byte[] dataByte = Base64.decodeBase64(encryptedData); // 加密秘钥 byte[] keyByte = Base64.decodeBase64(sessionKey); // 偏移量 byte[] ivByte = Base64.decodeBase64(iv); try { // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 int base = 16; if (keyByte.length % base != 0) { int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; Arrays.fill(temp, (byte) 0); System.arraycopy(keyByte, 0, temp, 0, keyByte.length); keyByte = temp; } // 初始化 Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters .getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { result = new String(resultByte, "UTF-8"); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidParameterSpecException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (NoSuchProviderException e) { e.printStackTrace(); } return result; }

调用方法:

String encryptedData = "";
String iv = "";
String session_key = "";
String json = MiniAESUtil.getUserInfo(encryptedData, session_key, iv);
String wxDecrypt = MiniAESUtil.wxDecrypt(encryptedData, session_key, iv);
System.out.println(json);
System.out.println(wxDecrypt);	

两个输出结果是一样的,两种方法实现解密!

 

下载地址:https://download.csdn.net/download/zhuchenglin830/11199995

你可能感兴趣的:(微信小程序)