微信小程序解密encryptedData报错:pad block corrupted 解决方法

这篇具有很好参考价值的文章主要介绍了微信小程序解密encryptedData报错:pad block corrupted 解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天碰到一个pad block corrupted错误,跟代码发现是Cipher里面的doFinal()爆出的错。

代码:

public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) {
    try {
      // 加密秘钥
      byte[] keyByte = Base64.decodeBase64(sessionKey);
      // 偏移量
      byte[] ivByte = Base64.decodeBase64(iv);

      // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
      int base = 16;
      if (keyByte.length % base != 0) {
        int groups = keyByte.length / base + 1;
        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[] dataByte = Base64.decodeBase64(encryptedData);
      byte[] resultByte = cipher.doFinal(dataByte);
      if (null != resultByte && resultByte.length > 0) {
        String result = new String(resultByte, StandardCharsets.UTF_8);
        log.info("解析微信加密数据==>{}", result);
        return JSONObject.parseObject(result);
      }
    } catch (BadPaddingException e) {
      log.error("解析微信加密数据失败", e);
      throw Exceptions.fail(WECHAT_SESSION_EXPIRED);
    }
    return null;
  }

错误:

javax.crypto.BadPaddingException: pad block corrupted
	at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(Unknown Source)
	at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
	at javax.crypto.Cipher.doFinal(Cipher.java:2087)
	at com.saic.ebiz.service.util.AESUtils.getUserInfo(AESUtils.java:62)
	at com.saic.ebiz.service.util.AESUtils.main(AESUtils.java:86)
Exception in thread "main" java.lang.NullPointerException
	at com.saic.ebiz.service.util.AESUtils.main(AESUtils.java:87)

找到微信官方社区,才发现这是微信的一个bug。现在有没有解决不清楚,但是我们自己可以解决。

原因:wx.login获取session_key,而sessionKey又是解密encryptedData的密钥,所以一旦我们的wx.login在wx.getUserInfo(getphonenumber…)之后获取,我们存储的sessionKey绝对不是当前获取encryptedData的密钥。

我的解决方案:

第一种方法、前端保证wx.login获取到的code在getUserInfo(getphonenumber…)操作之前。

第二种方法、也可以是后端,社区还提供另外一种方案Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");中BC去掉,我还没试过,因为我用前面的方法就解决了。文章来源地址https://www.toymoban.com/news/detail-510146.html

到了这里,关于微信小程序解密encryptedData报错:pad block corrupted 解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AES解密报错Invalid AES key length: xx bytes与Given final block not properly padded的解决方法

    最近和其它系统联调接口,用到了Java的AES加解密。 由其它系统AES加密,本人的系统获取到加密报文后,AES解密,获取到内容。 本来是比较简单的,可是其它系统只提供了秘钥,没有提供解密方法,解密方法需要我们自己写…… 正常应该是加密方提供解密方法的吧,我觉得…

    2024年02月01日
    浏览(24)
  • 微信小程序中获取用户手机号密文数据解密报错问题

    微信小程序获取手机号,官方通常会返回密文数据给我们,此时就需要我们自行解密数据。在揭秘的数据过程中会发现,第一次授权获取手机号会出现错误,再次获取的时候就能够正常获取。 错误信息一般分两种: 密文后端解密的 javax.crypto.BadPaddingException: pad block corrupted(后

    2024年02月15日
    浏览(32)
  • uni微信小程序 map 添加padding

    规划驾车线路的时候,使用uni的 include-points 指定可视范围的时候,会很极限。导致marker不能完全显示。 给地图显示范围添加padding (推荐) 或者获取并修改缩放地图(记得设置中心点) uni文档:点击这里 1的效果图:

    2024年02月04日
    浏览(22)
  • 【微信小程序/uniapp】视频如何在pad端可以横屏播放

    相信做视频类小程序的伙伴们一定会遇到视频在【pad】系列上播放的问题,我们会发现,当在pad端点击全屏播放的时候,他是竖屏的全屏(如图1),即便我们旋转屏幕,他依旧是竖屏类型的全屏(如图2) (图1) (图2) 而我们想要的效果是全屏【横屏】播放 那么如何能实

    2024年02月13日
    浏览(48)
  • 微信小程序中block和View组件的使用区别

    在微信小程序中,block和View组件都是用于布局的组件,但它们在使用方式和功能上有一些区别。 1. Block组件:    - Block组件是一个无实际显示效果的组件,它主要用于包裹一组组件,并提供了类似于div的作用。    - 使用Block组件可以将一组组件进行分组,便于样式的管理和

    2024年02月04日
    浏览(37)
  • 微信小程序逆向解密

    WeChatAppEx.exe 版本:2.0.6609.4 以融智云考学生端为例。 网上已经有关于微信小程序解密的非常优秀的文章,本着学习的目的便不参考相关内容。 笔者水平实在有限,如发现纰漏,还请读者不吝赐教。 工具:火绒剑 首先看看打开一个小程序微信做了点什么,对微信进行火绒行为

    2024年02月11日
    浏览(22)
  • 微信小程序--解密用户信息

    前端传值:encryptedData、iv、code step1:将code发送给微信服务器,获取openid和session_key step2:根据encryptedData、iv、session_key(会话密钥),通过AES解密获取到用户所有信息

    2024年02月15日
    浏览(16)
  • 微信小程序前端加解密逆向分析

    某小程序渗透测试项目,测试时发现请求包内容进行了加密 小程序文件目录: 使用网易Mumu模拟器,开启root权限,安装手机微信并访问指定小程序,然后打开RE文件管理器,在 data/data/com.tencent.mm/MicroMsg 会生成一个md5加密命名的文件夹,在该文件夹下的 appbrand/pkg 目录下找到

    2024年02月05日
    浏览(29)
  • 微信小程序之 base-64加密、解密

    后端获取 token 接口,需要加密认证

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包