微信小程序解密encrypted获取用户unionid

微信的解析加密信息encrypted 中的坑.

1.需要注意得是微信端传入vi与encryptedData 的一致性 .spingboot的后台默认接收json的数据格式.传输值中可能"+"加号,后台接收的值,servlet自动转成" "空格,导致解析失败.希望后续开发者不要在这个问题上耽搁太久.

,我目前的做法是直接把接收值中的空格替换成加号,"+"

        encryptedData = encryptedData.replace(" ", "+");

        iv = iv.replace(" ", "+");

暂时没有发现问题.

更好的做法是直接把传输值转换成加密数据.后台再次解密可以避免.

	public static JSONObject getDecryptMsg(String encryptedData, String iv, String sessionKey) {

		byte[] dataByte = Base64.decode(encryptedData);

		byte[] keyByte = Base64.decode(sessionKey);

		byte[] ivByte = Base64.decode(iv);

		try {

			int base = 16;

			if (keyByte.length % base != 0) {

				int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);

				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[] resultByte = cipher.doFinal(dataByte);

			if (null != resultByte && resultByte.length > 0) {

				String result = new String(resultByte, "UTF-8");

				return JSONObject.parseObject(result);

			}

		} catch (Exception e) {

			e.printStackTrace();

		}

		return null;

	}

猜你喜欢

转载自shuhui.iteye.com/blog/2440059