微信小程序用户信息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 相关文章推荐
小试JQuery的AutoComplete插件
May 04 Javascript
javascript学习笔记(十九) 节点的操作实现代码
Jun 20 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
JavaScript操作DOM元素的childNodes和children区别
Apr 01 Javascript
jQuery+ajax实现文章点赞功能的方法
Dec 31 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
Apr 18 Javascript
微信小程序 数据绑定详解及实例
Oct 25 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
Feb 15 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
layui radio点击事件实现input显示和隐藏的例子
Sep 02 Javascript
vue中 v-for循环的用法详解
Feb 19 Javascript
JS不要再到处使用绝对等于运算符了
Apr 30 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文件读写操作之文件写入代码
2011/01/13 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
JS字符串函数扩展代码
2011/09/13 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
JavaScript实现简单随机点名器
2019/11/21 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
python中异常报错处理方法汇总
2016/11/20 Python
Python正则表达式完全指南
2017/05/25 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
5款实用的python 工具推荐
2020/10/13 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
eBay奥地利站:eBay.at
2019/07/24 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
财务会计专业推荐信
2013/11/30 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
廉政教育的心得体会
2014/09/01 职场文书
交通事故和解协议书
2015/01/27 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书