微信小程序解密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 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 解决方法相关推荐
- 微信小程序解密encryptedData报错pad block corrupted
前要: 今天调试一下微信授权登录的时候老是第一次报错解密失败pad block corrupted,第二次授权的时候正常,因为第一次已经获取到手机号码! 后端代码: public static JSO ...
- 微信小程序解密encryptedData报错:pad block corrupted 解决方法
今天碰到一个pad block corrupted错误,跟代码发现是Cipher里面的doFinal()爆出的错. 代码: public static JSONObject getUserInfo(S ...
- 微信小程序授权信息报错:pad block corrupted
接手的老代码中,授权用户信息和授权手机号之前每次都会调用wx.login 导致新用户第一次授权用户信息一定报错 之后后端打印日志发现报错pad block corrupted,经过看网上的解决办法后发 ...
- 微信小程序手机号解密报错:pad block corrupted 解决方法
微信小程序手机号解密报错:pad block corrupted 解决方法 微信小程序获取用户手机号,后端解密手机号的时候偶尔会报错 javax.crypto.BadPaddingException: ...
- 微信小程序渲染图片报错:[渲染层网络层错误] Failed to load local image resource
微信小程序渲染图片报错解决:[渲染层网络层错误] Failed to load local image resource 背景 通过用户点击上传图片,通过res.tempFilePaths拿到用户上传 ...
- 微信小程序request:fail报错(包括不执行fail回调问题)
微信小程序request:fail报错(包括不执行fail回调的问题) 1. 不执行fail回调的问题 2. request:fail报错原因 2.1 小程序未配置域名导致的错误 2.2 微信小程序使 ...
- uniapp引入自定义组件canvas 不现实,运行到微信小程序端时会报错
问题1 在引入自定义canvas组件时,在微信开发者工具中为空白,和h5中不现实 原因 在微信开发者工具 错误案例,没有加实例化this 在h5中不实现为空白是没有onReady里面实例化canvas ...
- java silk转mp3_微信小程序录音文件格式silk遇到的问题及解决方法
不好意思,误导大家了,这种将silk解密的方式只是在小程序测试的时候可以,上线以后这种方法是不行的,还是需要使用解密转码.参见:https://github.com/kn007/silk-v3-dec ...
- 微信小程序在开发中遇到的问题与解决方法
微信小程序在开发中遇到的问题与解决方法 参考文章: (1)微信小程序在开发中遇到的问题与解决方法 (2)https://www.cnblogs.com/zjjDaily/p/8032142.html ...
- 微信小程序支付接口报错:appid和openid不匹配
一.接口地址 二.接口几个字段讲解 三.报错的原因 四.解决方法 一.接口地址 地址在 -> 微信官方文档 -> 微信支付 -> 小程序支付 -> 统一下单 对比 V2-旧版, ...
最新文章
- RHEL7升级openssh7.4p1教程
- 8种最有可能在2016年倒闭的光伏企业
- JVM GC 日志详解
- 图解web前端开发工具教程
- 中国枳实提取物市场营销模式建议与竞争格局展望报告2022年
- qa 芯片测试_智能硬件产品的测试经验总结
- 高性能负载均衡设计入门篇
- c++五子棋_Java五子棋实现
- 曾鸣:未来十年,将确定智能商业的格局|干货
- body 没有被撑开_父div没有被撑开,该怎么解决?_html/css_WEB-ITnose
- odoo里用sql语句说为日期date类型,没有转换为字符串。
- 最长递增子序列(LIS longest-increment-subsequence)最长连续递增子序列 最大连续子序列和
- WebLogic下载地址(各版本)
- 零基础入门机器学习——声音识别——打卡Task1
- 仿短视频竖屏播放美nv源码 源码仅供技术参考
- jscc控制器说明书_JSCC精研调速器 精研SF90E数显调速器 90W精研马达面板控制器
- 计算机网络基础教程第二版答案,计算机网络技术实用教程(第2版)课后习题答案...
- token失效 判断access_微信怎么判断微信accesstoken是否过期
- Qt开源作品35-秘钥生成器
- 原生js实现小方块拖拽
热门文章
- c语言中十六进制可以直接和十进制运算吗,C语言 · 十六进制转十进制
- matlab control包,免费试用Instrument Control Toolbox
- 国庆节怎么少得了国旗:国旗头像
- matlab分数阶微分算子,数字图像处理以及数值运算中6种经典的分数阶微分掩模(分数阶微分算子)...
- 使用PhotoShop制作公章
- windows 配置中科大的 Rust 下载云,提高下载速度
- 家中的两台计算机如何实现联网,怎么设置用两台电脑实现局域网共享上网
- Andriod 实现一个类微信聊天界面 (二)
- mount挂载不上,不提示任何信息
- Springboot实现remember-me记住我功能