微信小程序用户信息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与vbscript数据共享
Jan 09 Javascript
jquery.validate使用攻略 第二部
Jul 01 Javascript
html中的input标签的checked属性jquery判断代码
Sep 19 Javascript
js动画(animate)简单引擎代码示例
Dec 04 Javascript
简单易用的倒计时js代码
Aug 04 Javascript
js实现鼠标点击左上角滑动菜单效果代码
Sep 06 Javascript
JavaScript  cookie 跨域访问之广告推广
Apr 20 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
Aug 16 Javascript
微信小程序模版渲染详解
Jan 26 Javascript
vue代码分割的实现(codesplit)
Nov 13 Javascript
理理Vue细节(推荐)
Apr 16 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
Dec 15 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 无线电
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
Python自定义一个类实现字典dict功能的方法
2019/01/19 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
python中删除某个元素的方法解析
2019/11/05 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
新闻学毕业生自荐信
2013/11/15 职场文书
出生医学证明样本
2014/01/17 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python