微信小程序用户信息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 相关文章推荐
限制复选框的最大可选数
Jul 01 Javascript
js loading加载效果实现代码
Nov 24 Javascript
浅析tr的隐藏和显示问题
Mar 05 Javascript
javascript动态判断html元素并执行不同的操作
Jun 16 Javascript
JavaScript 模块的循环加载实现方法
Dec 13 Javascript
关于在Servelet中如何获取当前时间的操作方法
Jun 28 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
Vue.js用法详解
Nov 13 Javascript
vue.js内置组件之keep-alive组件使用
Jul 10 Javascript
原生js+ajax分页组件
Jan 30 Javascript
Vue组件生命周期运行原理解析
Nov 25 Vue.js
elementui实现预览图片组件二次封装
Dec 29 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 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHPMailer发送邮件
2016/12/28 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
2015/02/11 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
python list删除元素时要注意的坑点分享
2018/04/18 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
淘宝中秋节活动方案
2014/01/31 职场文书
《荷花》教学反思
2014/04/16 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书
Redis 哨兵机制及配置实现
2022/03/25 Redis