当前位置:   article > 正文

微信小程序用户隐私数据解密_[-41003]illegal_buffer

[-41003]illegal_buffer

我们在获取到小程序的加密数据后,首先做的是校验数据,校验通过后进行数据的解密

一、新建隐私数据解密工具类——WXBizDataUtil

  1. /**
  2. * @Author: zp.wei
  3. * @DATE: 2020/7/7 14:47
  4. */
  5. public class WXBizDataUtil {
  6. public static String illegalAesKey = "-41001";//非法密钥
  7. public static String illegalIv = "-41002";//非法初始向量
  8. public static String illegalBuffer = "-41003";//非法密文
  9. public static String decodeBase64Error = "-41004"; //解码错误
  10. public static String noData = "-41005"; //数据不正确
  11. private String appid;
  12. private String sessionKey;
  13. public WXBizDataCrypt(String appid, String sessionKey) {
  14. this.appid = appid;
  15. this.sessionKey = sessionKey;
  16. }
  17. /**
  18. * 检验数据的真实性,并且获取解密后的明文.
  19. *
  20. * @param encryptedData string 加密的用户数据
  21. * @param iv string 与用户数据一同返回的初始向量
  22. * @return String 返回用户信息
  23. */
  24. public String decryptData(String encryptedData, String iv) {
  25. if (StringUtils.length(sessionKey) != 24) {
  26. return illegalAesKey;
  27. }
  28. // 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  29. byte[] aesKey = Base64.decodeBase64(sessionKey);
  30. if (StringUtils.length(iv) != 24) {
  31. return illegalIv;
  32. }
  33. // 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
  34. byte[] aesIV = Base64.decodeBase64(iv);
  35. // 对称解密的目标密文为 Base64_Decode(encryptedData)
  36. byte[] aesCipher = Base64.decodeBase64(encryptedData);
  37. try {
  38. byte[] resultByte = AESUtil.decrypt(aesCipher, aesKey, aesIV);
  39. if (null != resultByte && resultByte.length > 0) {
  40. String userInfo = new String(resultByte, "UTF-8");
  41. JSONObject jsons = JSON.parseObject(userInfo);
  42. String id = jsons.getJSONObject("watermark").getString("appid");
  43. if (!StringUtils.equals(id, appid)) {
  44. return illegalBuffer;
  45. }
  46. return userInfo;
  47. } else {
  48. return noData;
  49. }
  50. } catch (InvalidAlgorithmParameterException e) {
  51. e.printStackTrace();
  52. } catch (UnsupportedEncodingException e) {
  53. e.printStackTrace();
  54. }
  55. return null;
  56. }
  57. /**
  58. * 根据微信数据和sessionkey生成用于校验的签名
  59. *
  60. * rawData 微信数据
  61. * sessionKey sessionkey
  62. */
  63. public static String getsignature2(String rawData, String sessionKey) throws UnsupportedEncodingException, NoSuchAlgorithmException {
  64. String stringASCII = rawData + sessionKey;
  65. String signature2 = null;
  66. try {
  67. //指定sha1算法
  68. MessageDigest digest = MessageDigest.getInstance("SHA-1");
  69. digest.update(stringASCII.getBytes("UTF-8"));
  70. //获取字节数组
  71. byte messageDigest[] = digest.digest();
  72. // 创建 Hex 字符串
  73. StringBuffer hexString = new StringBuffer();
  74. // 字节数组转换为 十六进制 数
  75. for (int i = 0; i < messageDigest.length; i++) {
  76. String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
  77. if (shaHex.length() < 2) {
  78. hexString.append(0);
  79. }
  80. hexString.append(shaHex);
  81. signature2 = hexString.toString().toLowerCase();
  82. }
  83. } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
  84. throw e;
  85. }
  86. return signature2;
  87. }
  88. }

二,新建AES解密工具类——AESUtil

  1. /**
  2. * @Author: zp.wei
  3. * @DATE: 2020/7/7 14:48
  4. */
  5. public class AESUtil {
  6. static {
  7. Security.addProvider(new BouncyCastleProvider());
  8. }
  9. /**
  10. * AES解密
  11. *
  12. * @param content 密文
  13. * @return
  14. * @throws InvalidAlgorithmParameterException
  15. * @throws NoSuchProviderException
  16. */
  17. public static byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte)
  18. throws InvalidAlgorithmParameterException {
  19. try {
  20. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
  21. Key sKeySpec = new SecretKeySpec(keyByte, "AES");
  22. //生成iv
  23. AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
  24. params.init(new IvParameterSpec(ivByte));
  25. cipher.init(Cipher.DECRYPT_MODE, sKeySpec, params);// 初始化
  26. return cipher.doFinal(content);
  27. } catch (NoSuchAlgorithmException e) {
  28. e.printStackTrace();
  29. } catch (NoSuchPaddingException e) {
  30. e.printStackTrace();
  31. } catch (InvalidKeyException e) {
  32. e.printStackTrace();
  33. } catch (IllegalBlockSizeException e) {
  34. e.printStackTrace();
  35. } catch (BadPaddingException e) {
  36. e.printStackTrace();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. return null;
  41. }
  42. }

二、在controller相关方法里调用该工具类下的 decryptData 方法,即下面代码所示

  1. private JSONObject getUserInfo(String iv, String encryptedData, String sessionKey) {
  2. String userInfo = null;
  3. //解密数据
  4. try {
  5. WXBizDataCrypt biz = new WXBizDataCrypt(CommonConfig.appletAppID, sessionKey);
  6. userInfo = biz.decryptData(encryptedData, iv);
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }
  10. return JSONObject.parseObject(userInfo);
  11. }

最后获取到的 userInfo 就是解密后的用户隐私数据了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/525030
推荐阅读
相关标签
  

闽ICP备14008679号