Java中解密微信加密数据工具类

偏执的太偏执、 2022-10-07 00:50 237阅读 0赞

当我们开发微信公众号,小程序等,微信返回给我们的数据往往是经过加密的,我们需要使用 sessionKey 配合解密,才能得到我们想要的数据

  • 1、引入依赖


    org.projectlombok
    lombok
    true



    com.alibaba
    fastjson
    1.2.60



    org.apache.commons
    commons-lang3
    3.8.1



    org.bouncycastle
    bcprov-jdk15on
    1.55
  • 2、解密工具类

    import com.alibaba.fastjson.JSONObject;
    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.StringUtils;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;

    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.AlgorithmParameters;
    import java.security.Security;
    import java.util.Arrays;

    /**

    • 解密微信加密数据工具类
      */
      @Slf4j
      public class WechatUtils {

      /**

      • 解密微信加密数据
        *
      • @param encryptedData
      • @param iv
      • @param sessionkey
      • @return
        */
        public static JSONObject decryptWechatData(String encryptedData, String iv, String sessionkey) {
        // 被加密的数据
        byte[] dataByte = Base64.decode(encryptedData);
        // 加密秘钥
        byte[] keyByte = Base64.decode(sessionkey);
        // 偏移量
        byte[] ivByte = Base64.decode(iv);
        try {
        1. int base = 16;
        2. if (keyByte.length % base != 0) {
        3. int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
        4. byte[] temp = new byte[groups * base];
        5. Arrays.fill(temp, (byte) 0);
        6. System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
        7. keyByte = temp;
        8. }
        9. Security.addProvider(new BouncyCastleProvider());
        10. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
        11. SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
        12. AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
        13. parameters.init(new IvParameterSpec(ivByte));
        14. cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
        15. byte[] resultByte = cipher.doFinal(dataByte);
        16. if (null != resultByte && resultByte.length > 0) {
        17. String result = new String(resultByte, "UTF-8");
        18. if (StringUtils.isNotBlank(result)) {
        19. log.info("----------解密微信数据成功----------");
        20. return JSONObject.parseObject(result);
        21. }
        22. }
        } catch (Exception e) {
        1. e.printStackTrace();
        2. log.info("----------解密微信数据失败----------");
        }
        return null;
        }
        }

这样,我们将微信加密的数据,转化成了 JSON 对象,就得到了我们想要的数据了

如您在阅读中发现不足,欢迎留言!!!

发表评论

表情:
评论列表 (有 0 条评论,237人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java加密解密工具

    工具类作用域 > 现在不管web或者后端的一些项目里,难免要对数据进行加密,往简单了讲,前端要将用户的密码传送到后台数据库进行保存,后台保存的肯定不能是明文,要在插入数据