微信小程序解密手机号码异常

news/2024/7/20 2:36:13 标签: 微信小程序, 小程序

在后台解密用户手机号码时,偶尔会报以下异常:
javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption

javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
	at com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:975)
	at com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1056)
	at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853)
	at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
	at javax.crypto.Cipher.doFinal(Cipher.java:2164)

只需要把AES/CBC/PKCS5Padding换成AES/CBC/PKCS7Padding即可。

	public static String decrypt(String data, String key, String iv) throws Exception {
		byte[] encrypData = Base64Utils.decodeFromString(data);
        byte[] ivData = Base64Utils.decodeFromString(iv);
        byte[] sessionKey = Base64Utils.decodeFromString(key);
        String resultString = null;
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivData);
        SecretKeySpec keySpec = new SecretKeySpec(sessionKey, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        resultString = new String(cipher.doFinal(encrypData), "UTF-8");

		return resultString;
	}

微信官方文档是这样写的:

加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

微信官方使用的填充规则是PKCS7,而PKCS5是PKCS7的子集,所以存在某种情况下无法解密的情况。
这里要吐槽一下,微信提供了几种编程语言的实例代码,偏偏没有Java的,难道是觉得Java太简单了,没必要示范?!


http://www.niftyadmin.cn/n/856114.html

相关文章

Java double和float精度损失问题

问题 一般,我们会用float和double来存储有小数的数据,可能还会用两个浮点型数据进行计算,在某些情况下,float和double会出现精度损失,导致存储的数据或者计算结果出现误差。 举个例子 public class Test {public st…

Eclipse各版本下载地址

https://archive.eclipse.org/eclipse/downloads/

汉明距离(Hamming Distance)

汉明距离(Hamming Distance) 定义 汉明距离以美国数学家理查德卫斯里汉明的名字命名,表示两个相同长度的字符串在相同位置上不同字符的个数。用d(x,y)来表示x和y两个字符串的汉明距离。汉明距离可以用来计算两个文本之间的相似度&#xff0…

杰卡德系数(Jaccard Index)

杰卡德系数(Jaccard Index) 杰卡德系数,又称为杰卡德相似系数,用于比较两个样本之间的差异性和相似性。杰卡德系数越高,则两个样本相似度越高。 定义 有两个集合A和B,那么这两个集合的杰卡德系数为A和B的…

微信小程序获取地理位置最佳实现

定位 微信小程序获取用户当前位置需要用户的授权,可以直接调用 wx.getLocation,微信会弹出授权提示,如果用户曾经拒绝过授权则不会弹窗。 根据微信官方文档: 授权 部分接口需要经过用户授权同意才能调用。我们把这些接口按使用范…

Column count doesn’t match value count at row 1

MyBatis批量插入数据报错&#xff1a;Column count doesn’t match value count at row 1 意思是列数目跟值数目不匹配。 这样写的&#xff1a; <insert id"saveMobileGeos">INSERT INTO mobile_geo(mobile_prefix,province,city,zip_code,area_code,operator)…

多版本MyEclipse共存

问题 装了myeclipse10.7.1和2018.12.0&#xff0c;破解&#xff08;请支持正版&#xff09;成功后又破解&#xff08;请支持正版&#xff09;2018.12.0&#xff0c;发现10.7.1也不能用了。 分析 破解会在用户目录下保存MyEclipse许可证文件&#xff0c;如&#xff1a;C:\Use…

Typora Beta版过期解决

今天打开Typora&#xff0c;提示过期&#xff0c;直接不能用了&#xff0c;卸载重装&#xff0c;还是不行。 The beta version of typora is expired, please download and install a newer version2022-07-15更新 很遗憾&#xff0c;今天发现方法二不行了&#xff0c;方法一可…