解密微信小程序加密信息

Love The Way You Lie 2022-12-04 08:59 300阅读 0赞

获取微信程序人员信息之后,会给一个加密字符串,这个时候,前端不太好解密,因为浪费性能,会请求后端解密,那么后端如何解密呢?demo来说话;

1、首先工具类

  1. package com.XXX.member.utils;
  2. import com.alibaba.fastjson.JSONObject;
  3. import lombok.Data;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.spec.IvParameterSpec;
  6. import javax.crypto.spec.SecretKeySpec;
  7. import java.security.AlgorithmParameters;
  8. import java.security.Key;
  9. import java.security.Security;
  10. import java.util.Base64;
  11. /**
  12. * 小程序 AES 解密工具
  13. *
  14. * @author Kilde
  15. */
  16. @Data
  17. public class WXBizDataCrypt {
  18. // public static void main(String[] args) {
  19. //
  20. // String appId = "wx4f4bc4dec97d474b";
  21. // String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
  22. // String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
  23. // String iv = "r7BXXKkLb8qrSNn05n0qiA==";
  24. //
  25. // WXBizDataCrypt pc = new WXBizDataCrypt(appId,sessionKey);
  26. // JSONObject decrypt = pc.decrypt(encryptedData, iv);
  27. //
  28. // System.out.println(decrypt.toString());
  29. //
  30. // }
  31. public static JSONObject getMoreInfoFromEncryptedData(String appId, String sessionKey, String encryptedData, String iv) {
  32. WXBizDataCrypt pc = new WXBizDataCrypt(appId, sessionKey);
  33. JSONObject decrypt = pc.decrypt(encryptedData, iv);
  34. return decrypt;
  35. }
  36. private String appId;
  37. private String sessionKey;
  38. public WXBizDataCrypt(String appId, String sessionKey) {
  39. this.appId = appId;
  40. this.sessionKey = sessionKey;
  41. }
  42. /**
  43. * 解密成json
  44. *
  45. * @param encryptedData
  46. * @param iv
  47. * @return
  48. */
  49. public JSONObject decrypt(String encryptedData, String iv) {
  50. byte[] encryptedDataDecode = Base64.getDecoder().decode(encryptedData);
  51. byte[] sessionKeyDecode = Base64.getDecoder().decode(this.sessionKey);
  52. byte[] ivDecode = Base64.getDecoder().decode(iv);
  53. Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
  54. byte[] decodeData = decode(encryptedDataDecode, sessionKeyDecode, ivDecode);
  55. String stringData = new String(decodeData);
  56. JSONObject jsonObject = JSONObject.parseObject(stringData);
  57. return jsonObject;
  58. }
  59. /**
  60. * 解密算法 AES-128-CBC
  61. * 填充模式 PKCS#7
  62. *
  63. * @param encryptedDataDecode 目标密文
  64. * @return
  65. * @throws Exception
  66. */
  67. private byte[] decode(byte[] encryptedDataDecode, byte[] sessionKeyDecode, byte[] iv) {
  68. try {
  69. Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
  70. Key sKeySpec = new SecretKeySpec(sessionKeyDecode, "AES");
  71. cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(iv));// 初始化
  72. byte[] result = cipher.doFinal(encryptedDataDecode);
  73. return result;
  74. } catch (Exception e) {
  75. throw new RuntimeException(e);
  76. }
  77. }
  78. /**
  79. * 处理iv
  80. *
  81. * @param iv
  82. * @return
  83. * @throws Exception
  84. */
  85. private AlgorithmParameters generateIV(byte[] iv) throws Exception {
  86. AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
  87. params.init(new IvParameterSpec(iv));
  88. return params;
  89. }
  90. }

2、真正的代码

  1. @Transactional(rollbackFor = Exception.class)
  2. @Override
  3. public JsonResult<UserInfoVoWeChatInfoDTO> saveAcode2SessionUserInfo(UserInfoVoWeChatInfoVO userInfoVoWeChatInfoVO) {
  4. if (Objects.isNull(userInfoVoWeChatInfoVO)) {
  5. return new JsonResult(JsonResultEnum.ARGS_NOT_FULL);
  6. }
  7. String encryptedData = userInfoVoWeChatInfoVO.getEncryptedData();
  8. Integer flag = userInfoVoWeChatInfoVO.getFlag();
  9. String iv = userInfoVoWeChatInfoVO.getIv();
  10. String sessionKey = userInfoVoWeChatInfoVO.getSessionKey();
  11. String openId = userInfoVoWeChatInfoVO.getOpenId();
  12. if (StringUtils.isBlank(encryptedData) ||
  13. StringUtils.isBlank(iv) ||
  14. StringUtils.isBlank(sessionKey) ||
  15. StringUtils.isBlank(openId) ||
  16. Objects.isNull(flag)) {
  17. return new JsonResult(JsonResultEnum.ARGS_NOT_FULL);
  18. }
  19. UserInfoVo userInfoVo = UserInfoVo.builder().build();
  20. String userPhone = userInfoVo.getUserPhone();
  21. String wechatAvatar = userInfoVo.getWechatAvatar();
  22. String wechatNickname = userInfoVo.getWechatNickname();
  23. String wechatOpenid = userInfoVo.getWechatOpenid();
  24. /**
  25. * 用户信息的
  26. * {"country":"CN","unionId":"ocMvos6NjeKLIBqg5Mr9QjxrP1FA","watermark":{"appid":"wx4f4bc4dec97d474b","timestamp":1477314187},"gender":1,"province":"Guangdong","city":"Guangzhou","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0","openId":"oGZUI0egBJY1zhBYw2KhdUfwVJJE","nickName":"Band","language":"zh_CN"}
  27. *
  28. * 手机号的
  29. *
  30. * {"phoneNumber":"186168383*2","watermark":{"appid":"wxf0e8d778d88e861b","timestamp":1598263205},"purePhoneNumber":"18616838312","countryCode":"86"}
  31. *
  32. */
  33. if (flag.equals(NumberUtils.INTEGER_ONE)) {
  34. JSONObject moreInfoFromEncryptedDataJosn =
  35. WXBizDataCrypt.getMoreInfoFromEncryptedData(appid, sessionKey, encryptedData, iv);
  36. //优先选这个
  37. userPhone = String.valueOf(moreInfoFromEncryptedDataJosn.get("phoneNumber"));
  38. userPhone = StringUtils.isBlank(userPhone) ? String.valueOf(moreInfoFromEncryptedDataJosn.get("purePhoneNumber")) : userPhone;
  39. wechatOpenid = openId;
  40. } else if (flag.equals(NumberUtils.INTEGER_TWO)) {
  41. JSONObject moreInfoFromEncryptedDataJosn =
  42. WXBizDataCrypt.getMoreInfoFromEncryptedData(appid, sessionKey, encryptedData, iv);
  43. wechatAvatar = moreInfoFromEncryptedDataJosn.getString("avatarUrl");
  44. wechatNickname = moreInfoFromEncryptedDataJosn.getString("nickName");
  45. wechatOpenid = openId;
  46. }
  47. UserInfo userInfo = userInfoMapper.selectUserInfo(openId, userPhone);
  48. if (Objects.isNull(userInfo)) {
  49. //等获取到再补充更正
  50. UserInfo build = UserInfo.builder()
  51. .userMoney(0)
  52. .userName("0")
  53. .userPhone(StringUtils.isBlank(userPhone) ? "0" : userPhone)
  54. .wechatNickname(StringUtils.isBlank(wechatNickname) ? "0" : wechatNickname)
  55. .wechatAvatar(StringUtils.isBlank(wechatAvatar) ? "0" : wechatAvatar)
  56. .wechatOpenid(openId)
  57. .build();
  58. int i = userInfoMapper.insertUser(build);
  59. if (i != 1) {
  60. log.error("小程序获取Acode2Session信息保存失败---build:{}", JSON.toJSONString(build));
  61. return JsonResult.error(JsonResultEnum.EXCEPTION_ERROR.getMsg());
  62. }
  63. } else if (Objects.nonNull(userInfo) && StringUtils.isNotBlank(wechatNickname) && StringUtils.isNotBlank(wechatAvatar)) {
  64. userInfo.setUserPhone(StringUtils.isBlank(userPhone) ? "0" : userPhone);
  65. userInfo.setWechatNickname(wechatNickname);
  66. userInfo.setWechatAvatar(wechatAvatar);
  67. int i = userInfoMapper.updateByPrimaryKeySelective(userInfo);
  68. if (i != 1) {
  69. log.error("完善微信授权信息失败---build:{}", JSON.toJSONString(userInfo));
  70. return JsonResult.error(JsonResultEnum.EXCEPTION_ERROR.getMsg());
  71. }
  72. }
  73. if (flag.equals(NumberUtils.INTEGER_ONE)) {
  74. UserInfoVoWeChatInfoDTO resultObject = UserInfoVoWeChatInfoDTO.builder()
  75. .phone(userPhone)
  76. .openId(openId)
  77. .build();
  78. return new JsonResult(JsonResultEnum.SUCCESS, resultObject);
  79. } else if (flag.equals(NumberUtils.INTEGER_TWO)) {
  80. UserInfoVoWeChatInfoDTO resultObject = UserInfoVoWeChatInfoDTO.builder().phone(userPhone)
  81. .wechatAvatar(wechatAvatar)
  82. .wechatNickname(wechatNickname)
  83. .phone(userInfo.getUserPhone())
  84. .openId(openId).build();
  85. return new JsonResult(JsonResultEnum.SUCCESS, resultObject);
  86. }
  87. return JsonResult.seccess();
  88. }

发表评论

表情:
评论列表 (有 0 条评论,300人围观)

还没有评论,来说两句吧...

相关阅读