微信小程序用户信息encryptedData详解


Posted in Javascript onAugust 24, 2018

之前做过一个版本是根据encryptData和Session_key解密得到完整的用户信息(包含union_id)的方法去获取用户信息,由于小程序升级,如今需要废弃encryptData的方式去获取用户信息,改成使用encryptedData的方式获取用户信息。

新的数据解密方法

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

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

微信官方提供了多种编程语言的示例代码。每种语言类型的接口名字均一致。调用方式可以参照示例。

另外,为了应用能校验数据的有效性,我们会在敏感数据加上数据水印( watermark )

{
  "openId": "OPENID",
  "nickName": "NICKNAME",
  "gender": GENDER,
  "city": "CITY",
  "province": "PROVINCE",
  "country": "COUNTRY",
  "avatarUrl": "AVATARURL",
  "unionId": "UNIONID",
  "watermark":
  {
    "appid":"APPID",
    "timestamp":TIMESTAMP
  }
}

总的来说还是原来的算法,还是原来的逻辑结构,不同的是解密方式,以前是通过session_key得到iv,现如今是直接从前台接口处得到iv来解密,所改变的也只是传输的数据

@RequestMapping(value = "/web/wechatapp/jscode2session", method = RequestMethod.POST)
  @ResponseBody
  public String getSessionByCode(@RequestBody String jsonStr, HttpServletRequest request) {
    JSONObject jsonObj = JSONObject.fromObject(jsonStr);
    String code = (String) jsonObj.get("code");
    JSONObject wechatAppUserInfo = jsonObj.getJSONObject("wechatAppUserInfo");
    String encryptedData = (String) wechatAppUserInfo.get("encryptedData");
    String iv = (String) wechatAppUserInfo.get("iv");

    WechatUserInfo wechatUserInfo = wechatAppManager.doOAuth(code, encryptedData, iv);
    if (wechatUserInfo == null) {
      throw new BusinessException(BusinessException.Code.WECHAT_OAUTH_ERROR, "微信小程序授权失败!!!");
    }
    HttpSession session = request.getSession(true);
    User user = wechatUserInfo.getUser();
    logger.debug("微信小程序用户 union id: {}, 对应车车用户{}", wechatUserInfo.getUnionid(), user.getId());
    session.setAttribute(WebConstants.SESSION_KEY_USER, CacheUtil.doJacksonSerialize(user));
    ClientTypeUtil.cacheClientType(request, ClientType.WE_CHAT_APP);
    return session.getId();
}

解密的算法

public static byte[] decrypt(String dataStr,String keyStr, String ivStr) throws Exception{
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    byte[] encryptedData = Base64.decode(dataStr);
    byte[] keyBytes = Base64.decode(keyStr);
    AlgorithmParameters iv = WechatAppDecryptor.generateIV(Base64.decode(ivStr));
    Key key = convertToKey(keyBytes);
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    //设置为解密模式
    cipher.init(Cipher.DECRYPT_MODE, key,iv);
    return cipher.doFinal(encryptedData);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
Mar 04 Javascript
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
asp.net刷新本页面的六种方法总结
Jan 07 Javascript
jQuery中closest和parents的区别分析
May 07 Javascript
浅谈javascript中return语句
Jul 15 Javascript
jquery ztree实现树的搜索功能
Feb 25 Javascript
JavaScript队列的应用实例详解【经典数据结构】
Apr 12 Javascript
通过命令行生成vue项目框架的方法
Jul 12 Javascript
ng-repeat指令在迭代对象时的去重方法
Oct 02 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
Aug 06 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 Javascript
element-ui 中的table的列隐藏问题解决
Aug 24 #Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 #Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
Aug 24 #Javascript
element-ui 表格数据时间格式化的方法
Aug 24 #Javascript
vue select选择框数据变化监听方法
Aug 24 #Javascript
vue左侧菜单,树形图递归实现代码
Aug 24 #Javascript
jQuery md5加密插件jQuery.md5.js用法示例
Aug 24 #jQuery
You might like
php fckeditor 调用的函数
2009/06/21 PHP
QueryPath PHP 中的jQuery
2010/04/11 PHP
php自动加载机制的深入分析
2013/06/08 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
Javascript注入技巧
2007/06/22 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
Python实现FTP文件传输的实例
2019/07/07 Python
Python如何合并多个字典或映射
2020/07/24 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
python 利用zmail库发送邮件
2020/09/11 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
思想品德课教学反思
2016/02/24 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers