Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3657253
  • 博文数量: 365
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2522
  • 用 户 组: 普通用户
  • 注册时间: 2019-10-28 13:40
文章分类

全部博文(365)

文章存档

2023年(8)

2022年(130)

2021年(155)

2020年(50)

2019年(22)

我的朋友

分类: Java

2021-07-07 17:31:33

当我们开发微信公众号,小程序等,微信返回给我们的数据往往是经过加密的,我们需要使用 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 {

            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) {

                String result = new String(resultByte, "UTF-8");

                if (StringUtils.isNotBlank(result)) {

                    log.info("----------解密微信数据成功----------");

                    return JSONObject.parseObject(result);

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

            log.info("----------解密微信数据失败----------");

        }

        return null;

    }

}

阅读(1893) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~