Java后端解密微信小程序返回加密数据

前端自行开发java小程序后端,各种吃苦就不吹了。

参考了很多文章,在记录小程序用户和同一账号下其他获取用户信息的app/公众号的平台中,如果要想统一起来用户,记录unionId才能正确的进行对应,而在小程序中,获取微信用户的unionId需要通过wx.log()之后再次调用wx.getUserInfo()接口才会通过加密的方式返回(在注册小程序的账号下,暂时没有其他使用微信用户的第三方没有,其他情况可能会返回,请自行参考)。而要获取的话需要将微信的返回进行解密操作后才能顺利取出。

废话不多说,讲一下解密的代码。首先是java工程,微信并未提供相关的算法代码。只能自己写或者通过百度/google找一份了,找的过程中发现很多的博文都不太顺利,其中参考了博文进行了尝试基本完成了代码。https://blog.csdn.net/wujin274/article/details/76604964

不多说,上代码

package com.network;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;

public class Test {

    public static void main(String[] args) {
        String session_key = "gQoIRc5n3qWgqBePwT2prQ==";
        String iv = "VzE1kg8Xc1G/FanPceiBSg==";
        String encryptData = "0b113c76cOI5RfUWo4aAlI+CdZKP+M0Y4wBaSKhTsanQeB2jvPkaHroGNVoxx5nLS3jpfyOMj/hEtzAb17aMd/hBKGqlTTTCmpw6iguoDLEevG54Y1i6AmiUuc5R67RTiMF6f82ilH1G74KHBrA2A/FK2w/isqp1Jggo0QW1GH3EC/dHnk5ihNCJfsb6xXhbMdfGZkMzEe7TQW6AGzRLDkV7GpJqryUgu5K2fg8RpSZxerGAcYdEOb7O3fVM0MciIQL9FjVJ7NbgBV5c1TrFG7GplPF6zHB0tFPMUVmqZqjDqL6DnCQejJk03vAM8hE9yiFrYG5L9wP1NM1gkOx8IFNmwIHNTBUPM/3VjHMNJQQt/pRxGPuoj3VRXrlqMKNo/uVpGuyOWuuwG0bycVZkGOxQ2P8ZwlYWYvhiOCiPMyIoiE55bV/S0c=";
        String decrypt = decrypt(session_key, iv, encryptData);
        System.out.println(decrypt);
    }

    public static String decrypt(String session_key, String iv, String encryptData) {
        String decryptString = "";
        init();
        byte[] sessionKeyByte = Base64.decodeBase64(session_key);
        byte[] ivByte = Base64.decodeBase64(iv);
        byte[] encryptDataByte = Base64.decodeBase64(encryptData);

        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
            Key key = new SecretKeySpec(sessionKeyByte, "AES");
            AlgorithmParameters algorithmParameters = AlgorithmParameters.getInstance("AES");
            algorithmParameters.init(new IvParameterSpec(ivByte));
            cipher.init(Cipher.DECRYPT_MODE, key, algorithmParameters);
            byte[] bytes = cipher.doFinal(encryptDataByte);
            decryptString = new String(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return decryptString;
    }

    private static boolean hasInited = false;

    public static void init() {
        if (hasInited) {
            return;
        }
        Security.addProvider(new BouncyCastleProvider());
        hasInited = true;
    }


}

由于涉及到个人信息,将其中的encryptData去除了一部分,直接使用代码不能顺利解密,请自行通过微信获取相关的数据进行尝试。

另附上用到的依赖包:

  <dependency>
          <groupId>org.bouncycastlegroupId>
          <artifactId>bcprov-jdk15onartifactId>
          <version>1.55version>
      dependency>
      <dependency>
          <groupId>commons-codecgroupId>
          <artifactId>commons-codecartifactId>
          <version>1.10version>
      dependency>

上图是我在Intellj Idea中添加的工程依赖,其中bcprov-jdk15on是为了支持AES的BouncyCastleProvider,而commons-codec则是为了顺利的对session_key,iv,encryptData进行Base64的编解码

如需jar包,请自行到maven仓储进行搜索相关jar包

tips:虽然我很菜,但是我必须说一下,如果有购买ssr需求的小伙伴,推荐一下我的链接,速度很快比较稳定,请自行选择
https://staryun.me/auth/register?code=AfxUstxSiXYzO7XeDVh7gpA9wghxo3vs

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