微信小程序用户信息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 相关文章推荐
JSON.parse 解析字符串出错的解决方法
Jul 08 Javascript
jquery cookie实现的简单换肤功能适合小网站
Aug 25 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
Jan 14 Javascript
JavaScript获取table中某一列的值的方法
May 06 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
Dec 01 Javascript
JavaScript实现获取远程的html到当前页面中
Mar 26 Javascript
AngularJS2中一种button切换效果的实现方法(二)
Mar 27 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 Javascript
LayerClose弹窗关闭刷新方法
Aug 17 Javascript
浅谈小程序 setData学问多
Feb 20 Javascript
vue绑定数字类型 value为数字的实例
Aug 31 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编写的简单页面跳转功能实现代码
2013/11/27 PHP
php二维码生成
2015/10/19 PHP
jQuery的deferred对象详解
2014/11/12 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
一分钟理解js闭包
2016/05/04 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
微信小程序switch组件使用详解
2018/01/31 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
python中的错误处理
2016/04/10 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
python 将Excel转Word的示例
2021/03/02 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
学生就业推荐信
2013/11/13 职场文书
中英文自我评价常用句型
2013/12/19 职场文书
教师演讲稿大全
2014/05/16 职场文书
优秀家长自荐材料
2014/08/26 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
坎儿井导游词
2015/02/09 职场文书
医生辞职信范文
2015/03/02 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书