微信小程序用户信息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 打造动态渐变按钮 详细图文教程
Apr 25 Javascript
JavaScript 中的日期和时间及表示标准介绍
Aug 21 Javascript
微信小程序 POST请求的实例详解
Sep 29 Javascript
vue 使用eventBus实现同级组件的通讯
Mar 02 Javascript
说说node中的可读流和可写流的区别
Jun 01 Javascript
JS实现面向对象继承的5种方式分析
Jul 21 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
Mar 09 Javascript
js简单遍历获取对象中的属性值的方法示例
Jun 19 Javascript
原生JavaScript实现滑动拖动验证的示例代码
Dec 06 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 Javascript
JavaScript实现简易计算器小功能
Oct 22 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开发GUI
2006/10/09 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
JavaScript实现区块链
2018/03/14 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
django站点管理详解
2017/12/12 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
python获取array中指定元素的示例
2019/11/26 Python
如何用Python绘制3D柱形图
2020/09/16 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
服装销售人员求职自我评价
2013/09/26 职场文书
专科文秘应届生求职信
2013/11/18 职场文书
数学国培研修感言
2014/02/13 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
2015年中秋寄语
2015/07/31 职场文书
小学科学课教学反思
2016/02/23 职场文书
Python中的嵌套循环详情
2022/03/23 Python