微信小程序解析用户加密数据
微信公众号 IT果果日记
前言
在上一篇文章“微信小程序如何获取用户信息”中我们完成了用户明文数据的校验工作,本文将学习解密用户的非明文用户信息,也就是获取用户的openId和unionId。
解密
调用wx.getUserProfile后将返回encryptedData和iv两个数据。encryptedData是包括敏感数据在内的完整用户信息的加密数据,iv用于解密这个数据。整个解密用户数据的过程同上篇文章中用户信息校验的流程基本相同。不同的是,我们提交到服务器的数据是encryptedData和iv,而不是signature和rawData。下面编写用户数据解密的核心代码:
wx.login({success: function (loginRes){wx.getUserProfile({success: function (userRes){wx.request({url: "http://localhost:8080/wxopen/wxdecryptuserinfo"data: {code: loginRes.code,encryptedData: userRes.encryptedData,iv: userRes.iv},success: function(res){console.log(res.data);}})}})}
})
以上代码将code(用于获取session_key)、encryptedData和iv 3个参数发送到了后端接口wxdecryptuserinfo中。
服务器如何解密encryptedData数据呢?解密时需要session_key、iv、小程序的AppId 3个变量参与。session_key由code可以换取到,iv由小程序客户端提交,AppId本身就是一个固定的已知变量。
具体的解密算法较为复杂,但微信官方提供了包括C++、NodeJS、PHP和Python 4种语言的解密SDK,我们只需要使用官方提供的SDK即可,无须自己编写解密算法。目前,官方没有提供JAVA和C#版本的SDK,开发者可自行翻译。下面是java的解密代码实现:
Map<String,Object> map = new HashMap<>(7);
map.put("appid",wxAppId);
map.put("secret",wxSecret);
map.put("js_code", param.getCode());
map.put("grant_type",grantType);
WxCode2SessionRet result = null;
try{String url = "https://api.weixin.qq.com/sns/jscode2session";String info = HttpUtil.get(url, map);result = JSON.parseObject(info, WxCode2SessionRet.class);
} catch (Exception e){log.error("code2session失败", e);return null;
}
try {String result = AesCbcUtil.decrypt(param.getEncryptedData(), result.getSession_key(), param.getIv(), "UTF-8");JSONObject wxInfo = JSONObject.parseObject(result);String unionId = wxInfo.getString("unionId");String openid = sessionRet.getOpenid();
} catch (Exception e) {throw new RuntimeException("用户信息校验失败");
}
AesCbcUtil.decrypt 解密方法
public static String decrypt(String data, String key, String iv, String encodingFormat) {//被加密的数据byte[] dataByte = Base64.decodeBase64(data);//加密秘钥byte[] keyByte = Base64.decodeBase64(key);//偏移量byte[] ivByte = Base64.decodeBase64(iv);try {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {String result = new String(resultByte, encodingFormat);return result;}return null;} catch (Exception e) {log.error("解密失败",e);throw new RuntimeException("解密失败");}
}
WxCode2SessionRet.java
@Data
public class WxCode2SessionRet implements Serializable {private String openid;private String session_key;private String unionid;private String errcode;private String errmsg;
}
这样,就可以从加密数据encryptedData里解密出我们想要的UnionId和openId了。
微信公众号 IT果果日记
https://gitee.com/chenzhaoplus
https://github.com/chenzhaoplus
https://blog.csdn.net/cz285933169?spm=1010.2135.3001.5421
相关文章:
微信小程序解析用户加密数据
微信公众号 IT果果日记前言在上一篇文章“微信小程序如何获取用户信息”中我们完成了用户明文数据的校验工作,本文将学习解密用户的非明文用户信息,也就是获取用户的openId和unionId。解密调用wx.getUserProfile后将返回encryptedData和iv两个数据。encr…...
毕业四年换了3份软件测试工作,我为何仍焦虑?
今天一看日历:2023.2.11 ,才突然意识到自己毕业已经四年了。四年时间里一直在测试行业摸爬滚打,现在是时候记录一下了。 下面我来分享下我这4年软件测试经验及成长历程,或许能帮助你解决很多工作中的迷惑。 01、我是如何开始做…...
嵌入式C基础知识(7)
是否可以传递任何参数并从 ISR 返回值不可以。不能传递任何参数并从 ISR 返回值。 ISR 不返回任何内容,并且不允许传递任何参数。 当硬件或软件事件发生时调用 ISR,而代码不会调用它。 这就是为什么不向 ISR 传递参数的原因。 由于代码不调用 ISR&#x…...
大数据系列之:安装pulsar详细步骤
大数据系列之:安装pulsar详细步骤一、Pulsar版本和jdk对应关系二、安装JDK三、设置和激活jdk环境变量四、下载和解压Pulsar五、查看Pulsar目录六、启动Pulsar standalone cluster七、创建Kafka Topic八、往Topic写入数据九、消费pulsar的Topic一、Pulsar版本和jdk对…...
色彩-基础理论
颜色三大指标 色相 色相是颜色的一个属性,只有黑白灰没有色相这个属性(那银灰色是什么?) 颜色的相貌,指的也是给颜色一个名字 例如:暗红、酒红、土黄、墨绿 饱和度 颜色的鲜艳程度 纯度 饱和度主要取决于含色成分和消色成分&a…...
1629_MIT_6.828_xv6_chapter1操作系统的组织
全部学习汇总:GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这一次整理一下操作系统组织相关的知识,主要还是xv6教学操作系统相关的知识。当然,很多知识在这类技术领域是通用的。 1. 操作系统的主要功能…...
基于Golang哈希算法监控配置文件变化
SHA(secure hashing algorithm)表示安全哈希算法.SHA是MD5的修正版本,用于数据摘要和认证。哈希和加密类似,唯一区别是哈希是单项的,即哈希后的数据无法解密。SHA有不同的算法,主要包括SHA-1, SHA-2, SHA-256, SHA-512, SHA-224, …...
关于一笔画问题的一些思考(欧拉路Fleury算法、逐步插入回路法、以及另一种可能的解法)
前言这是一个经典的图论问题了最近复习离散的时候又恰好看到了,发现自己以前的解法似乎有点bug然后开始出反例卡自己,结果发现卡不掉?然后再好好想了想,发现这个看起来有问题的做法可能确实没问题。注意:欧拉路、欧拉回…...
vlookup怎么用详细步骤,看这一篇就够了
1、vlookup函数:使用方法 以下便是vlookup函数,功能、语法和参数用法: excel函数vlookup 2、vlookup函数:查询参数 首先,选中F2单元格,然后在编辑栏输入函数公式:VLOOKUP(E2,B&…...
雅思经验(9)之小作文常用词汇总结
写作:关于趋势的上升和下降在小作文中,真的是非常常见的,所以还是要积累一下。下面给出了很多词,但是在雅思写作中并不是词越丰富,分数就越高的。雅思写作强调的是准确性:在合适的地方用合适的词和句法。不…...
【Python语言基础】——Python NumPy 数组创建
Python语言基础——Python NumPy 数组创建 文章目录 Python语言基础——Python NumPy 数组创建一、Python NumPy 数组创建一、Python NumPy 数组创建 创建 NumPy ndarray 对象 NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。 我们可以使用 array() 函数创建一个 NumP…...
【大数据】Hadoop-Kms 安装及相关详细配置,看完你就会了
简介 Hadoop KMS是基于Hadoop的KeyProvider API的加密密钥管理服务器,它提供了使用REST API通过HTTP进行通信的客户端和服务器组件。 客户端是一个KeyProvider实现,使用KMS HTTP REST API与KMS交互。 KMS及其客户端具有内置的安全性,它们支…...
SpringCloud分布式框架
SpringCloud分布式框架 SpringCloud框架 Spring Cloud 是一个用于创建分布式系统的开源框架。它基于 Spring Boot 和 Spring Framework,提供了一整套关于分布式系统的工具和技术。 Spring Cloud 是微服务架构的一种实现方式,它提供了一整套完整的技术…...
Csss属性display,visibility区别,对渲染页面的影响
display: none; 与 visibility: hidden; 的区别 相同: 它们都能让元素不可见 区别:display:none;会让元素完全从渲染树中消失,渲染的时候不占据任何空间; visibility: hidden;不会让元素从渲染树消失,渲染时元素继续…...
怎么给笔记本电脑外接两台显示器?
我们在办公室会看见不少同事的电脑不止一台显示器,多屏确实可以提高工作效率。有的游戏党也会选择给电脑外接显示器,带来绝佳的体验。 不过要怎么把将外部显示器连接到笔记本电脑上?驱动人生在这里教给大家给笔记本外接显示器的做法。 一、…...
生成树协议 — STP
目录 一、环路的出现 1、广播风暴: 2、MAC地址表翻滚: 二、生成树 1、定义: 2、生成树使用的算法: 三、802.1D 1、BPDU: 2、TCN—拓扑变更消息(也是BPDU): 3、部分名词&am…...
git必会的知识点
注:本文参考https://www.liaoxuefeng.com/wiki/896043488029600 原文非常值得一读,作者学识渊博,补充了很多有意思的知识。我仅仅是拾人牙慧。 git是最先进的分布式版本控制系统。 版本控制系统——自动记录系统中文件的改动情况࿰…...
【hello, world】计算机系统漫游
文章目录hello程序信息就是位 上下文程序被其他程序翻译成不同的格式预处理阶段编译阶段汇编阶段链接阶段了解编译系统如何工作是大有益处的优化程序性能理解链接时出现的错误避免安全漏洞处理器读并解释储存在内存中的指令系统的硬件组成总线I/O设备主存处理器运行hello程序高…...
1. SpringMVC 简介
文章目录1. SpringMVC 概述2. SpringMVC 入门案例2.1 入门案例2.2 入门案例工作流程3. bean 加载控制4. PostMan 工具1. SpringMVC 概述 SpringMVC 与 Servlet 功能等同,均属于 Web 层开发技术。SpringMVC 是 Spring 框架的一部分。 对于 SpringMVC,主…...
《解谜三星堆:开启中华文明之门》-范勇 笔记
甲篇 应重视民间流传的疑似三星堆的文物,对其展开充分的研究,以发现更多关于三星堆的秘密,并且避免“敦煌窘境”,让我国的三星堆学术研究处于世界领先地位!(书中就讲到了在民间首次发现了圆形玉器…...
3分钟掌握9大网盘直链解析:告别限速烦恼的高效下载方案
3分钟掌握9大网盘直链解析:告别限速烦恼的高效下载方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...
从FLAG_ONE_SHOT到FLAG_IMMUTABLE:深入解析Android S+版本PendingIntent的强制变革
1. 当PendingIntent遇上Android S:崩溃背后的安全升级 最近不少开发者在升级targetSdkVersion到31(Android 12)后,突然遭遇这样的崩溃提示:"Targeting S requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be…...
从Hello-World到Nginx:5个真实案例详解如何让Docker容器在后台稳定运行
从Hello-World到Nginx:5个真实案例详解如何让Docker容器在后台稳定运行 当你在终端输入docker run后,容器却像一阵风一样消失无踪——这种"闪退"现象往往是Docker新手遭遇的第一个认知颠覆点。不同于传统虚拟机,容器本质上是隔离的…...
【GD32】从零构建GD32开发环境(Keil 5)—— 固件库配置与工程创建实战
1. 为什么需要配置固件库? 刚接触GD32单片机的朋友可能会有疑问:为什么不能直接在Keil里写代码?这就好比装修房子,固件库就像是提前准备好的建材包,里面已经包含了墙面涂料、地板材料、门窗框架等标准件。如果每次开发…...
收藏!普通人零基础转行AI,3-5个月实现高薪就业的进阶指南
本文指出AI行业对非计算机专业人才的需求激增,半路转行者因具备行业经验而更具竞争力。文章澄清了转行AI的常见误区,强调“技术懂业务”是关键,并提供了普通人转行AI的3步走策略:选择AI算法、自然语言或应用工程师等低门槛岗位&am…...
ESXi 8.0 最低存储要求:8GB 起步,这样装最稳
在部署 VMware ESXi 8.0 虚拟化环境时,存储规划是基础且关键的一步,很多新手常混淆系统引导盘与虚拟机数据盘的要求。核心结论清晰:ESXi 8.0 最低需 8GB SD 卡 / USB 作为引导介质,同时必须搭配独立的数据存储;生产环境…...
为智能硬件项目集成大模型能力利用Taotoken实现低成本高可用的方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为智能硬件项目集成大模型能力利用Taotoken实现低成本高可用的方案 在智能家居、物联网等嵌入式硬件项目中引入大模型能力…...
3步重构你的系统菜单:告别混乱的高效管理方案
3步重构你的系统菜单:告别混乱的高效管理方案 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾经在右键点击文件时,面对满屏的无关…...
从VMware嵌套虚拟化到NFS共享存储:一份给运维新人的FusionCompute平台搭建避坑实录
从VMware嵌套虚拟化到NFS共享存储:一份给运维新人的FusionCompute平台搭建避坑实录 刚接触云计算平台搭建的运维工程师,往往会被各种专业术语和复杂配置搞得晕头转向。华为FusionCompute作为企业级虚拟化平台,功能强大但入门门槛不低。本文将…...
Sora 2国内可用性深度测评(2024Q2最新版):API调用失败率<0.8%的私有化部署方案首次公开
更多请点击: https://intelliparadigm.com 第一章:ChatGPT Sora 2视频生成怎么用 Sora 2 并非 OpenAI 官方发布的模型——截至目前(2024年中),OpenAI 仅公开了 Sora(初代)的演示能力࿰…...
