微信小程序用户信息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 相关文章推荐
js中判断Object、Array、Function等引用类型对象是否相等
Aug 29 Javascript
限制textbox或textarea输入字符长度的JS代码
Oct 16 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
Dec 24 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
Jan 18 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
Feb 25 Javascript
原生js实现简单的链式操作
Jul 04 Javascript
webpack 1.x升级过程中的踩坑总结大全
Aug 09 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
Aug 28 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
Sep 18 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
Oct 29 Javascript
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
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.ini 中文版
2006/10/28 PHP
php笔记之:AOP的应用
2013/04/24 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
Python处理文本文件中控制字符的方法
2017/02/07 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
Python处理session的方法整理
2019/08/29 Python
python sorted函数的小练习及解答
2019/09/18 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
Python如何发送与接收大型数组
2020/08/07 Python
详解Python中第三方库Faker
2020/09/25 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
导游词之南迦巴瓦峰
2019/11/19 职场文书
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python