当前位置: 首页 > 编程笔记 >

java微信小程序步数encryptedData和开放数据解密的实现

萧鹏云
2023-03-14
本文向大家介绍java微信小程序步数encryptedData和开放数据解密的实现,包括了java微信小程序步数encryptedData和开放数据解密的实现的使用技巧和注意事项,需要的朋友参考一下

前提:

三个参数,
1.sessionKey(拿openId的时候可以得到)
2.encryptedData(前端提供)
3.iv(前端提供)

一个类,一个方法

1.类:

import java.nio.charset.Charset;
import java.util.Arrays;
/**
 * 微信小程序加解密
 * @author liuyazhuang
 *
 */
public class WxPKCS7Encoder {
  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;
  }
}

2.方法:

import java.io.UnsupportedEncodingException;
import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.spec.InvalidParameterSpecException;
import java.util.HashMap;

import javax.annotation.Resource;
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.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;


import lombok.extern.slf4j.Slf4j;
@Slf4j
public class AesCbcUtil {

  static {
     //BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/
     Security.addProvider(new BouncyCastleProvider());
   }
 
   /**
   * AES解密
   *
   * @param data      //密文,被加密的数据
   * @param key      //秘钥
   * @param iv       //偏移量
   * @param encodingFormat //解密后的结果需要进行的编码
  * @param type //0 是其他 1是微信步数
   * @return
   * @throws Exception
   */
   public static String decrypt(String data, String key, String iv, String encodingFormat,Integer type) throws Exception {
//     initialize();
   if(StringUtils.isEmpty(data)||StringUtils.isEmpty(key)||StringUtils.isEmpty(iv))
    throw new SkyParamNullException("小程序获取用户信息参数不能为空");
     //被加密的数据
     byte[] dataByte = Base64.decodeBase64(data);
     //加密秘钥
     byte[] keyByte = Base64.decodeBase64(key);
     //偏移量
     byte[] ivByte = Base64.decodeBase64(iv);
 
 
     try {
       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
 
       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) {
       if (type==1){
   return new String(WxPKCS7Encoder.decode(resultByte));

   }else {
   return new String(resultByte, encodingFormat);

   }


       }
       return null;
     } catch (NoSuchAlgorithmException e) {
       e.printStackTrace();
       log.error("小程序解析出错1{}",e.getMessage());
     } catch (NoSuchPaddingException e) {
       e.printStackTrace();
       log.error("小程序解析出错2{}",e.getMessage());
     } catch (InvalidParameterSpecException e) {
       e.printStackTrace();
       log.error("小程序解析出错3{}",e.getMessage());
     } catch (InvalidKeyException e) {
       e.printStackTrace();
       log.error("小程序解析出错4{}",e.getMessage());
     } catch (InvalidAlgorithmParameterException e) {
       e.printStackTrace();
       log.error("小程序解析出错5{}",e.getMessage());
     } catch (IllegalBlockSizeException e) {
       e.printStackTrace();
       log.error("小程序解析出错6{}",e.getMessage());
     } catch (BadPaddingException e) {
       e.printStackTrace();
       log.error("小程序解析出错7{}",e.getMessage());
     }
  catch (UnsupportedEncodingException e) {
  e.printStackTrace();
  log.error("小程序解析出错8{}",e.getMessage());
  }
     return null;
   }
}

实现

@ApiOperation(value = "wx步数解密")
  @PostMapping(value = "/decode")
  public ResultModel<Object> questionList(@RequestBody WxSportParam param) throws Exception {
    HashMap<String, Object> map = wxXiaoChenXuUtil.getWxOpenId(//这个方法网上很多,没有就用binarywang的
     param.getCode()//前端提供的code
     ,sysProperties.getWxAppId()//appID
      ,sysProperties.getWxAppSecret());//secret
    String sessionKey = map.get("session_key").toString();
    String result = AesCbcUtil.decrypt(param.getData(), sessionKey,param.getIv(), "UTF-8",1);

    return ResultModel.success(result);
  }

出来的数据 :

{ “stepInfoList”: [
 {
“timestamp”: 1445866601,
“step”: 100
 },
 {
“timestamp”: 1445876601,
“step”: 120
 } ] }

tips:如果是解析用户信息的话一样的用法,解密decrypt中参数type传0。两者区别在于字节的decode方法不一样而已。

到此这篇关于java微信小程序步数encryptedData和开放数据解密的实现的文章就介绍到这了,更多相关java微信小程序步数encryptedData内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍微信小程序云开发(数据库)详解,包括了微信小程序云开发(数据库)详解的使用技巧和注意事项,需要的朋友参考一下 开发者可以使用云开发开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。

  • 本文向大家介绍微信小程序 数据遍历的实现,包括了微信小程序 数据遍历的实现的使用技巧和注意事项,需要的朋友参考一下 制作数据遍历的步骤 在index.js中加入数据。 在index.wxml中读取数据。   wx:for-item可以指定数组当前元素的变量名   wx:for-index可以指定数组当前下标的变量名   这两个项也可以不指定,默认数组的当前项的下标变量名默认为index,数组当前项

  • 本文向大家介绍微信小程序 数据访问实例详解,包括了微信小程序 数据访问实例详解的使用技巧和注意事项,需要的朋友参考一下 先简单说一下,小程序的结构 如图所示 1、每个视图(.wxml)只需要添加对应名字的脚本(.js)和样式(.wxss)就可以了,不需要引用,page下面的脚本以及样式都是继承至最外面的app.js , app.wxcss 2、脚本也就是.js文件,他有固定格式:page,是用于获

  • 微信小游戏为了保护其社交关系链数据,增加了 开放数据域 的概念,这是一个单独的游戏执行环境。开放数据域中的资源、引擎、程序,都和主游戏完全隔离,开发者只有在开放数据域中才能访问微信提供的 wx.getFriendCloudStorage() 和 wx.getGroupCloudStorage() 两个 API,用于实现一些例如排行榜的功能。由于开放数据域只能在离屏画布 sharedCanvas 上

  • 本文向大家介绍Java后台与微信小程序的数据交互实现,包括了Java后台与微信小程序的数据交互实现的使用技巧和注意事项,需要的朋友参考一下 想把自己写的一个小项目转成微信小程序,主要是因为小程序比较火,而且自己想学一下小程序的东西,所以抱着初学者的心态开始了这个痛苦的旅程。看过小程序的一点视频,个人感觉和HTML,css,js差不多,甚至比前端更简单一些,可能是微信小程序做不出来那些炫酷的动态效果

  • 本文向大家介绍微信小程序登录数据解密及状态维持实例详解,包括了微信小程序登录数据解密及状态维持实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了微信小程序登录数据解密及状态维持。分享给大家供大家参考,具体如下: 学习过小程序的朋友应该知道,在小程序中是不支持cookie的,借助小程序中的缓存我们也可以存储一些信息,但是对于一些比较重要的信息,我们需要通过登录状态维持来保存,同时,为了