微信小程序 encryptedData 的解密(JAVA)
上图为微信官方api提供的登陆获取用户信息的流程,session_key的得到这里不进行说明,详情可以看微信小程序的官方api。
数据签名校验为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key )
开发者将 signature、rawData 发送到开发者服务器进行校验。服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。
以上描述即为 微信小程序传过来的 rawData 和 已经得到session_key进行sha1加密之后的值 如果和signature相等的话 就表明数据校验通过,
加密数据解密算法接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
对称解密的目标密文为 Base64_Decode(encryptedData)。
对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。另外,为了应用能校验数据的有效性,会在敏感数据加上数据水印( watermark )
微信小程序会传来四个数据 其中两个为 rawData和 sighnature ,
还有两个为 encryptedData 和 iv
encryptedData session_key iv 这三个数据 经过特定的解密之后, 就可以得到用户信息了。
解密的工具类:
package cn.iyishuxy.common.utils;import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.Security;
import java.util.Arrays;/*** @author ljh*/
public class WXUtils {public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv){// 被加密的数据byte[] dataByte = Base64.decode(encryptedData);// 加密秘钥byte[] keyByte = Base64.decode(sessionKey);// 偏移量byte[] ivByte = Base64.decode(iv);try {// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要int base = 16;if (keyByte.length % base != 0) {int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyByte, 0, temp, 0, keyByte.length);keyByte = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");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, "UTF-8");return JSONObject.parseObject(result);}} catch (Exception e) {e.printStackTrace();}return null;}}
需要注意的是 BouncyCastleProvider包 需要手动导入maven:
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.59</version>
</dependency>
转载于:https://www.cnblogs.com/handsomejunhong/p/8670367.html
微信小程序 encryptedData 的解密(JAVA)相关推荐
- 微信小程序RSA加密与 Java RSA加密结果相同
业务需要,小程序上送到后台的数据需要使用RSA加密,后台返回的数据需要RSA解密.折腾了好久,微信小程序的加解密结果始终不一样.终于解决这问题记录一下. PS:后续使用过程中,发现小程序加密内容过长的 ...
- 微信小程序支付-付款(Java后台)
微信小程序支付-付款(Java后台) 一.概述 接触微信小程序支付有一段时间,趁着项目上线空闲期,来总结一下付款.退款.提现到银行卡.查询流水等步骤过程,涉及到的知识,以及编程过程中需要注意的问题. ...
- 【程序源代码】微信小程序商城管理系统(Java后台+微信小程序)最新版
关键字:微信小程序 商城系统 02 - [技术框架] 微信小程序商城管理系统(Java后台+微信小程序) 基于Spring+Vue+Mysql+Redis主流技术开发框架集成开发的微信商场管理系统:其 ...
- springboot 实现微信小程序授权并解密手机号
1.授权 授权是有前端完成的,授权后,前端可以获取到code,后台根据code获取微信小程序用户对应的openid和session_key,并根据openid判断是否是新用户,代码如下: @Value ...
- 微信小程序用户数据解密
概述 通过微信web开发者工具创建登录,获取用户信息,发送至后台,进行用户数据解密 详细 代码下载:http://www.demodashi.com/demo/10705.html 一.准备工作 1. ...
- 微信小程序获取手机号(Java)
微信小程序官方文档地址 :https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber. ...
- 微信小程序订阅信息之Java实现详解
在微信小程序中进行了某种操作后,推送消息告知用户的操作结果.或者微信端办公流程提交给下一个人审批后,得到审批通过或是驳回修改的命令 - 使用场景具体如下图,可用在签到.提醒.通知.警告.催办等方面: ...
- 微信小程序 获取手机号解密
解密步骤: 一: aes工具包1.相关依赖 <!--微信小程序进行解密加密的用户信息 --> <dependency><groupId>org.bouncycast ...
- 微信小程序登录注册demo+java服务器(一)
一.开发平台和前期准备 1.前端工具:微信web开发者工具 打web开发者工具,新建小程序项目,目录和名称自己随意填,AppID点击体验:小程序 小程序打开后,点击右上方的详情,项目设置,勾选不校验x ...
最新文章
- “做好大数据测试,我是认真的!”
- 步步为营 .NET 代码重构学习笔记 十
- 用python输出所有的玫瑰花数_用Python爬取WordPress官网所有插件
- React Native组件的结构和生命周期
- Adobe放出P图新研究:就算丢了半个头,也能逼真复原
- 金税盘显示frm000013_开票软件提示FRM-000013怎么回事?
- 两个月可以学完java吗?java要学多久?
- 下载电驴屏蔽资源办法
- Python测试:快乐的数字
- GB28181设备端PS流封装和发送
- 【SpringMVC】Resultful风格映射url
- mybatis 启动报错 分析
- Java前端和后端的区别?
- Disruptor笔记
- java对excel的操作
- 【MySQL】1安装与忘记密码
- BIGEMAPapp导入文件方式
- 本地存储玩家信息数据——单机、网络游戏必备
- 后端调优基础——GC调优
- 个人作业2-英语学习案例app分析
热门文章
- DOM 精通了?请问 Node 和 Element 有何区别?
- 用计算机模拟宇宙,计算机中的宇宙
- python 文字处理系统_详解Python中的文本处理
- ORACLE 数据同步时,批量进行新增和更新操作的SQL写法
- Mysql练习_MySQL练习(一)
- flex中list或Combox中的子项上移下移操作
- string转成对象_非常简单的string驻留池,你对它真的了解吗
- CDN加速下载VSCode-1.57.1
- git clone --depth=1引起的问题
- 限制滥用举报功能的小建议