微信小程序用户信息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中常用的函数和属性详细解析
Mar 07 Javascript
node.js中的fs.appendFileSync方法使用说明
Dec 17 Javascript
浅谈JavaScript字符串与数组
Jun 03 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
Jan 05 Javascript
基于Vuex无法观察到值变化的解决方法
Mar 01 Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 Javascript
Vue中实现权限控制的方法示例
Jun 07 Javascript
layui实现数据分页功能(ajax异步)
Jul 27 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
Sep 09 Javascript
浅谈Vue组件单元测试究竟测试什么
Feb 05 Javascript
JS实现点星星消除小游戏
Mar 24 Javascript
vue select 获取value和lable操作
Aug 28 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
Terran兵种对照表
2020/03/14 星际争霸
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
Python pickle模块用法实例
2015/04/14 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
python实现超级玛丽游戏
2020/03/18 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
python Gabor滤波器讲解
2020/10/26 Python
python打包生成so文件的实现
2020/10/30 Python
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
什么是Rollback Segment
2013/04/22 面试题
C#怎么让一个窗口居中显示?
2015/10/20 面试题
珍珠奶茶店创业计划书
2014/01/11 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
护理人员的自我评价分享
2014/03/15 职场文书