上图为微信官方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)相关推荐

  1. 微信小程序RSA加密与 Java RSA加密结果相同

    业务需要,小程序上送到后台的数据需要使用RSA加密,后台返回的数据需要RSA解密.折腾了好久,微信小程序的加解密结果始终不一样.终于解决这问题记录一下. PS:后续使用过程中,发现小程序加密内容过长的 ...

  2. 微信小程序支付-付款(Java后台)

    微信小程序支付-付款(Java后台) 一.概述 接触微信小程序支付有一段时间,趁着项目上线空闲期,来总结一下付款.退款.提现到银行卡.查询流水等步骤过程,涉及到的知识,以及编程过程中需要注意的问题. ...

  3. 【程序源代码】微信小程序商城管理系统(Java后台+微信小程序)最新版

    关键字:微信小程序 商城系统 02 - [技术框架] 微信小程序商城管理系统(Java后台+微信小程序) 基于Spring+Vue+Mysql+Redis主流技术开发框架集成开发的微信商场管理系统:其 ...

  4. springboot 实现微信小程序授权并解密手机号

    1.授权 授权是有前端完成的,授权后,前端可以获取到code,后台根据code获取微信小程序用户对应的openid和session_key,并根据openid判断是否是新用户,代码如下: @Value ...

  5. 微信小程序用户数据解密

    概述 通过微信web开发者工具创建登录,获取用户信息,发送至后台,进行用户数据解密 详细 代码下载:http://www.demodashi.com/demo/10705.html 一.准备工作 1. ...

  6. 微信小程序获取手机号(Java)

    微信小程序官方文档地址 :https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber. ...

  7. 微信小程序订阅信息之Java实现详解

    在微信小程序中进行了某种操作后,推送消息告知用户的操作结果.或者微信端办公流程提交给下一个人审批后,得到审批通过或是驳回修改的命令 - 使用场景具体如下图,可用在签到.提醒.通知.警告.催办等方面: ...

  8. 微信小程序 获取手机号解密

    解密步骤: 一: aes工具包1.相关依赖 <!--微信小程序进行解密加密的用户信息 --> <dependency><groupId>org.bouncycast ...

  9. 微信小程序登录注册demo+java服务器(一)

    一.开发平台和前期准备 1.前端工具:微信web开发者工具 打web开发者工具,新建小程序项目,目录和名称自己随意填,AppID点击体验:小程序 小程序打开后,点击右上方的详情,项目设置,勾选不校验x ...

最新文章

  1. “做好大数据测试,我是认真的!”
  2. 步步为营 .NET 代码重构学习笔记 十
  3. 用python输出所有的玫瑰花数_用Python爬取WordPress官网所有插件
  4. React Native组件的结构和生命周期
  5. Adobe放出P图新研究:就算丢了半个头,也能逼真复原
  6. 金税盘显示frm000013_开票软件提示FRM-000013怎么回事?
  7. 两个月可以学完java吗?java要学多久?
  8. 下载电驴屏蔽资源办法
  9. Python测试:快乐的数字
  10. GB28181设备端PS流封装和发送
  11. 【SpringMVC】Resultful风格映射url
  12. mybatis 启动报错 分析
  13. Java前端和后端的区别?
  14. Disruptor笔记
  15. java对excel的操作
  16. 【MySQL】1安装与忘记密码
  17. BIGEMAPapp导入文件方式
  18. 本地存储玩家信息数据——单机、网络游戏必备
  19. 后端调优基础——GC调优
  20. 个人作业2-英语学习案例app分析

热门文章

  1. DOM 精通了?请问 Node 和 Element 有何区别?
  2. 用计算机模拟宇宙,计算机中的宇宙
  3. python 文字处理系统_详解Python中的文本处理
  4. ORACLE 数据同步时,批量进行新增和更新操作的SQL写法
  5. Mysql练习_MySQL练习(一)
  6. flex中list或Combox中的子项上移下移操作
  7. string转成对象_非常简单的string驻留池,你对它真的了解吗
  8. CDN加速下载VSCode-1.57.1
  9. git clone --depth=1引起的问题
  10. 限制滥用举报功能的小建议