微信小程序用户信息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 相关文章推荐
从javascript语言本身谈项目实战
Dec 27 Javascript
Prototype 学习 工具函数学习($w,$F方法)
Jul 12 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
Sep 05 Javascript
能说明你的Javascript技术很烂的五个原因分析
Oct 28 Javascript
JavaScript mapreduce工作原理简析
Nov 25 Javascript
javascript full screen 全屏显示页面元素的方法
Sep 27 Javascript
Jquery解析Json格式数据过程代码
Oct 17 Javascript
js/jq仿window文件夹框选操作插件
Mar 08 Javascript
JS实现根据指定值删除数组中的元素操作示例
Aug 02 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
Aug 19 Javascript
vue+高德地图写地图选址组件的方法
May 18 Javascript
javascript 设计模式之组合模式原理与应用详解
Apr 08 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
如何开始收听短波广播
2021/03/01 无线电
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
Python迭代器和生成器定义与用法示例
2018/02/10 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
Python定义函数实现累计求和操作
2020/05/03 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
新三好学生主要事迹
2014/01/23 职场文书
团队口号大全
2014/06/06 职场文书
国庆宣传标语
2014/06/30 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2014年法院工作总结
2014/11/24 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL