微信小程序用户信息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 相关文章推荐
XHTML-Strict 内允许出现的标签
Dec 11 Javascript
JQuery 遮罩层实现(mask)实现代码
Jan 09 Javascript
js switch case default 的用法示例介绍
Oct 23 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
Apr 13 Javascript
分享12个非常实用的JavaScript小技巧
May 11 Javascript
Bootstrap3制作图片轮播效果
May 12 Javascript
iScroll.js 使用方法参考
May 16 Javascript
详解微信小程序Radio选中样式切换
Jul 06 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
Nov 14 Javascript
移动端如何用下拉刷新的方式实现上拉加载
Dec 10 Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
May 20 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 split汉字
2009/06/05 PHP
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
bootstrap+spring boot实现面包屑导航功能(前端代码)
2019/10/09 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
python实现提取百度搜索结果的方法
2015/05/19 Python
python中argparse模块用法实例详解
2015/06/03 Python
Python列表切片用法示例
2017/04/19 Python
Python开发的实用计算器完整实例
2017/05/10 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
python实战教程之自动扫雷
2018/07/13 Python
Python实现Dijkstra算法
2018/10/17 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
python 项目目录结构设置
2020/02/14 Python
python进行参数传递的方法
2020/05/12 Python
迪拜航空官方网站:flydubai
2017/04/20 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
导师工作推荐信范文
2014/05/17 职场文书
领导干部对照检查材料
2014/08/24 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
《假如》教学反思
2016/02/17 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript
排查MySQL生产环境索引没有效果
2022/04/11 MySQL
Fluentd搭建日志收集服务
2022/09/23 Servers