今天碰到一个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 corruptedat 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.NullPointerExceptionat 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…)操作之前。也可以是后端,因为项目是graphql,所以我是前端保证就行。社区还提供另外一种方案Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");中BC去掉,我还没试过,因为我用前面的方法就解决了。

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

  1. 微信小程序解密encryptedData报错pad block corrupted

    前要: 今天调试一下微信授权登录的时候老是第一次报错解密失败pad block corrupted,第二次授权的时候正常,因为第一次已经获取到手机号码! 后端代码: public static JSO ...

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

    今天碰到一个pad block corrupted错误,跟代码发现是Cipher里面的doFinal()爆出的错. 代码: public static JSONObject getUserInfo(S ...

  3. 微信小程序授权信息报错:pad block corrupted

    接手的老代码中,授权用户信息和授权手机号之前每次都会调用wx.login 导致新用户第一次授权用户信息一定报错 之后后端打印日志发现报错pad block corrupted,经过看网上的解决办法后发 ...

  4. 微信小程序手机号解密报错:pad block corrupted 解决方法

    微信小程序手机号解密报错:pad block corrupted 解决方法 微信小程序获取用户手机号,后端解密手机号的时候偶尔会报错 javax.crypto.BadPaddingException: ...

  5. 微信小程序渲染图片报错:[渲染层网络层错误] Failed to load local image resource

    微信小程序渲染图片报错解决:[渲染层网络层错误] Failed to load local image resource 背景 通过用户点击上传图片,通过res.tempFilePaths拿到用户上传 ...

  6. 微信小程序request:fail报错(包括不执行fail回调问题)

    微信小程序request:fail报错(包括不执行fail回调的问题) 1. 不执行fail回调的问题 2. request:fail报错原因 2.1 小程序未配置域名导致的错误 2.2 微信小程序使 ...

  7. uniapp引入自定义组件canvas 不现实,运行到微信小程序端时会报错

    问题1 在引入自定义canvas组件时,在微信开发者工具中为空白,和h5中不现实 原因 在微信开发者工具 错误案例,没有加实例化this 在h5中不实现为空白是没有onReady里面实例化canvas ...

  8. java silk转mp3_微信小程序录音文件格式silk遇到的问题及解决方法

    不好意思,误导大家了,这种将silk解密的方式只是在小程序测试的时候可以,上线以后这种方法是不行的,还是需要使用解密转码.参见:https://github.com/kn007/silk-v3-dec ...

  9. 微信小程序在开发中遇到的问题与解决方法

    微信小程序在开发中遇到的问题与解决方法 参考文章: (1)微信小程序在开发中遇到的问题与解决方法 (2)https://www.cnblogs.com/zjjDaily/p/8032142.html ...

  10. 微信小程序支付接口报错:appid和openid不匹配

    一.接口地址 二.接口几个字段讲解 三.报错的原因 四.解决方法 一.接口地址 地址在 -> 微信官方文档 -> 微信支付 -> 小程序支付 -> 统一下单 对比 V2-旧版, ...

最新文章

  1. RHEL7升级openssh7.4p1教程
  2. 8种最有可能在2016年倒闭的光伏企业
  3. JVM GC 日志详解
  4. 图解web前端开发工具教程
  5. 中国枳实提取物市场营销模式建议与竞争格局展望报告2022年
  6. qa 芯片测试_智能硬件产品的测试经验总结
  7. 高性能负载均衡设计入门篇
  8. c++五子棋_Java五子棋实现
  9. 曾鸣:未来十年,将确定智能商业的格局|干货
  10. body 没有被撑开_父div没有被撑开,该怎么解决?_html/css_WEB-ITnose
  11. odoo里用sql语句说为日期date类型,没有转换为字符串。
  12. 最长递增子序列(LIS longest-increment-subsequence)最长连续递增子序列 最大连续子序列和
  13. WebLogic下载地址(各版本)
  14. 零基础入门机器学习——声音识别——打卡Task1
  15. 仿短视频竖屏播放美nv源码 源码仅供技术参考
  16. jscc控制器说明书_JSCC精研调速器 精研SF90E数显调速器 90W精研马达面板控制器
  17. 计算机网络基础教程第二版答案,计算机网络技术实用教程(第2版)课后习题答案...
  18. token失效 判断access_微信怎么判断微信accesstoken是否过期
  19. Qt开源作品35-秘钥生成器
  20. 原生js实现小方块拖拽

热门文章

  1. c语言中十六进制可以直接和十进制运算吗,C语言 · 十六进制转十进制
  2. matlab control包,免费试用Instrument Control Toolbox
  3. 国庆节怎么少得了国旗:国旗头像
  4. matlab分数阶微分算子,数字图像处理以及数值运算中6种经典的分数阶微分掩模(分数阶微分算子)...
  5. 使用PhotoShop制作公章
  6. windows 配置中科大的 Rust 下载云,提高下载速度
  7. 家中的两台计算机如何实现联网,怎么设置用两台电脑实现局域网共享上网
  8. Andriod 实现一个类微信聊天界面 (二)
  9. mount挂载不上,不提示任何信息
  10. Springboot实现remember-me记住我功能