微信退款通知解密错误pad block corrupted 或者pad block corrupted

有些朋友可能遇到了下面的错误:
pad block corrupted
或者
last block incomplete in decryption
这很有可能是编码错误导致的
微信支付将req_info进行base64编码时,用的字符集不是UTF-8, 而是ISO-8859-1
如果你用UTF-8进行解码, 就一定会报错.

原因是:
将一个byte[]转换成String, 然后再从String转换为byte[]时,
第一个byte[]的值和第二个byte[]的值是不同的,
除非你指定字符集为ISO-8859-1, 或者默认字符集为ISO-8859-1.

由于UTF-8是多字节编码,需要用多个字节来表示一个字符的编码,所以也就出现了在转换之后byte[]数组长度、内容不一致的情况。
而ISO-8859-1编码是单字节编码,所以使用该编码就不会出现上面的问题

详情见下贴:
https://blog.youkuaiyun.com/qq_27760433/article/details/78327328

怎样解决这个问题呢?
方法有两种:
(1),
如果你使用java 8 自带的java.util.Base64类,
例如:
Base64.Decoder decoder = Base64.getDecoder();

那么解密方法这么写:

public static String decryptData(final String base64Data) throws Exception
{
	final Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING, "BC");
	cipher.init(Cipher.DECRYPT_MODE, key);
	return new Strin
### 微信登录 `PAD BLOCK CORRUPTED` 错误解决方案 #### 问题分析 当微信小程序进行手机号授权登录时,如果后台解密过程中出现 `javax.crypto.BadPaddingException: pad block corrupted` 的错误提示,则表明加密数据在传输或处理过程中可能出现了损坏或不一致的情况[^1]。 #### 解决方案概述 为了有效解决此问题并提高解密成功率,建议从以下几个方面入手: #### 确保参数最新性和一致性 确保每次请求使用的 `code` 是最新的,并且只使用一次。重复使用同一个 `code` 可能导致验证失败。此外,在从前端传递给后端的数据包中(如 `encryptedData`, `ivStr`),应保持其原始状态不变,任何修改都可能导致校验位的变化从而引发异常[^2]。 #### 验证前后端环境配置匹配度 确认前后端所采用的安全算法版本相同,特别是对于加/解密操作而言非常重要。不同平台间可能存在细微差异,这会影响最终的结果准确性。例如,Java 和 Node.js 对 AES 加密的支持就有所区别,因此需仔细核对文档说明以保证双方设置的一致性。 #### 更新与优化现有逻辑流程 针对原有实现方式存在的潜在缺陷作出调整改进。具体措施可以包括但不限于增加必要的日志记录以便于调试追踪;简化不必要的中间环节减少出错几率;以及考虑引入重试机制应对网络波动等因素造成的临时性故障等问题。 ```java // Java 后端示例代码片段用于正确接收和解析来自前端的信息 public String decrypt(String sessionKey, String iv, String encryptedData){ try { // 将Base64编码后的字符串转换成字节数组 byte[] resultByte = Base64.decode(encryptedData); byte[] keyBytes = new BASE64Decoder().decodeBuffer(sessionKey); byte[] ivBytes = new BASE64Decoder().decodeBuffer(iv); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); SecretKeySpec spec = new SecretKeySpec(keyBytes,"AES"); AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivBytes)); cipher.init(Cipher.DECRYPT_MODE,spec,parameters); byte[] decodeFormat = cipher.doFinal(resultByte); return new String(decodeFormat,"UTF-8"); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } ``` #### 测试与部署前充分准备 完成上述更改之后,务必进行全面的功能测试,模拟各种可能出现的真实场景来检验系统的稳定性和可靠性。只有经过严格的质量控制过程才能确保上线后的用户体验不受影响。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值