微信小程序用户信息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 相关文章推荐
cookie在javascript中的使用技巧以及隐私在服务器端的设置
Dec 03 Javascript
在JavaScript中typeof的用途介绍
Apr 11 Javascript
JS解决ie6下png透明的方法实例
Aug 02 Javascript
javascript检测浏览器的缩放状态实现代码
Sep 28 Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 Javascript
js解决软键盘遮挡输入框的问题分享
Dec 19 Javascript
Electron-vue开发的客户端支付收款工具的实现
May 24 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
Oct 21 Javascript
微信小程序跨页面传递data数据方法解析
Dec 13 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
Nov 10 Javascript
详解如何在Canvas中添加事件的方法
Apr 17 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
Wordpress php 分页代码
2009/10/21 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
jQuery 性能优化指南 (1)
2009/05/21 Javascript
javascript 写类方式之三
2009/07/05 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
2016/12/07 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
python检测服务器是否正常
2014/02/16 Python
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
python调用fortran模块
2016/04/08 Python
python用requests实现http请求代码实例
2019/10/31 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
越南综合购物网站:Lazada越南
2019/06/10 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
青春演讲稿范文
2014/05/08 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
工地宣传标语
2014/06/18 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
行为规范主题班会
2015/08/13 职场文书