微信小程序 encryptedData 的解密(JAVA)

小程序 -- 解密encryptedData敏感数据 这个问题解决了好久,在网上查找各种资料因为涉及到加密算法(不是很了解),所以进度很慢 还有就是小程序的坑是在时太多了,当然和自己不细心阅读文档也有关系(但是个人表示 一些文档真的都不清楚要表达的意思)特此记录。 首先声明下本文本着学习的态度与大家交流,如果有写的不好理解不够的地方欢迎大家指正,不喜勿喷。 上面这个图片大家的叫法不一样,什么个人开发者、个人号...... 本文以下称:个人号 ... 阅读详情

 

微信小程序 encryptedData 的解密(JAVA)

上图为微信官方api提供的登陆获取用户信息的流程,session_key的得到这里不进行说明,详情可以看微信小程序的官方api。

 

1

2

3

4

5

6

数据签名校验

 

为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。

 

通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key )

开发者将 signature、rawData 发送到开发者服务器进行校验。服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。

 

以上描述即为  微信小程序传过来的 rawData  和 已经得到session_key进行sha1加密之后的值 如果和signature相等的话 就表明数据校验通过,

 

1

2

3

4

5

6

7

8

9

10

11

加密数据解密算法

 

接口如果涉及敏感数据(如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  这三个数据 经过特定的解密之后, 就可以得到用户信息了。

 

解密的工具类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

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;

    }

 

}

  

1

需要注意的是 BouncyCastleProvider包 需要手动导入<br>maven:

1

2

3

4

5

<dependency>

    <groupId>org.bouncycastle</groupId>

    <artifactId>bcprov-jdk15on</artifactId>

    <version>1.59</version>

</dependency>

  原博客地址:https://www.cnblogs.com/handsomejunhong/p/8670367.html

小程序encryptedData 准备知识: Base64编解码AES算法、填充模式、偏移向量session_key会话密钥,以及怎么存储和获取 以上3点对于理解解密流程非常重要。 根据官方文档,我梳理了大致的解密流程,如下: 小程序客户端调用wx.login,回调里面包含js_code。然后将js_code发送到服务器A(开发者服务器),服务器A向微信服务器发起请求附带js_code、appId、 阅读详情

相关推荐

微信小程序解密encryptedData报错:pad block corrupted 解决方法

微信小程序解密encryptedData报错:pad block corrupted 解决方法

zlfjavahome的专栏 5043

Golang微信小程序解密 encryptedData 解密

golang 微信小程序开发

Mr_Yixiansen的博客 2131

微信小程序获取用户手机号的完整流程:从code到encryptedData解密(附Java工具类)

本文详细解析了微信小程序获取用户手机号的完整技术流程,从用户授权、获取code到后端Java解密encryptedData。重点阐述了session_key的管理机制、AES解密的核心代码实现,并提供了生产环境可用的Java工具类及关键问题排查指南,帮助开发者安全、高效地实现该功能。

wdx012345的博客 650

微信接口java解密_微信小程序 encryptedData 的解密(JAVA)

上图为微信官方api提供的登陆获取用户信息的流程,session_key的得到这里不进行说明,详情可以看微信小程序的官方api。数据签名校验为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signat...

weixin_39860636的博客 1213

SAP增强实施-第四代显式和隐式增强技术介绍

概念介绍 SAP第四代增强- Enhancement-Point,分为2种显式增强和隐式增强,显式增强就是手动加入到程序中的Enhancement options,隐式增强就是系统内置的Enhancement options。 第四代增强其实是第三代上的加强,都属于面向对象语言的接口技术的应用,但第四代增强使SAP增强实施更具灵活性,四代增强可以直接在源代码里面写增强了代码了,输入参数也不像 二代...

weixin_40672823的博客 7954

基于Plecs的LLC谐振变换器闭环设计:从PI参数整定到动态响应优化

本文详细介绍了在Plecs仿真环境中,如何为半桥LLC谐振变换器设计并优化闭环控制系统。从开环模型搭建与特性分析入手,重点阐述了基于频域法的PI控制器参数整定流程,并通过负载阶跃、输入电压突变等测试优化动态响应。文章还分享了从仿真模型过渡到实际硬件时的关键注意事项,帮助工程师实现稳定、高效的电源设计。

e4f5g6h的博客 624

Java游戏记录步数_java微信小程序步数encryptedData和开放数据解密的实现

前提:三个参数,1.sessionKey(拿openId的时候可以得到)2.encryptedData(前端提供)3.iv(前端提供)一个类,一个方法。1.类:import java.nio.charset.Charset;import java.util.Arrays;/*** 微信小程序加解密* @author liuyazhuang**/public class WxPKCS7Encoder...

weixin_42470438的博客 433

别再乱改grub.cfg了!手把手教你用GRUB2自定义多系统启动菜单(含UEFI/BIOS双模式配置)

本文详细介绍了如何安全、高效地使用GRUB2自定义多系统启动菜单,涵盖UEFI/BIOS双模式配置。通过避免直接编辑grub.cfg文件,采用正确的配置方法和命令,帮助用户打造稳定且美观的启动环境,特别适合Linux多系统用户和开发者。

weixin_42553471的博客 590

微信小程序 java解密代码_微信小程序java8 java7 java6 encryptedData 解密 异常处理...

使用java8 java7 java6 解密微信小程序encryptedData可以回遇到一些错误1.java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding2.Java.security.NoSuchProviderException: no such pro...

weixin_42118011的博客 251

MT5交易软件系统源码

Manager配置的功能及权限:管理客户、开户,销户、入金、信用额度、修改定单、人工交易报表、设定点差、强制平仓、修改密码,设定持仓交割单或挂单小止盈止损点数;26、修改价格 27、更改K线图历史价格 28、同步历史数据;2、系统设置 3、交易管理 4、交易柜台 5、价格更改 6、多台服。务器联机 7、恢复交易历史 8、数据源调整 9、备份服务调整 10、交易市场设定 11、交易单更改 12、平台时间设定(全世界) 13、可添加商品;15、设置商品利息;独立主机(服务器、VPS、VM)

tutujunjun的博客 904

EtherCAT简介

EtherCAT(EtherNet Control Automation Technology)是由德国公司BECKHOFF公司于2003年提出的实时工业以太网技术。其具有高速、高数据有效率的特点,支持多种设备的连接拓扑结构。从站节点使用专用的控制芯片,例如:microchip公司的Lan9252、BECKHOFF公司的ET1100等ESC(EtherCAT slave controller)芯片。主站的搭建方式有很多,例如:开源主站IGH、SOEM、商业化主站TwinCAT等。

m0_73482095的博客 1万+

java微信小程序的加密算法_java微信小程序步数encryptedData和开放数据解密的实现...

前提:三个参数,1.sessionKey(拿openId的时候可以得到)2.encryptedData(前端提供)3.iv(前端提供)一个类,一个方法。1.类:import java.nio.charset.Charset;import java.util.Arrays;/*** 微信小程序加解密* @author liuyazhuang**/public class WxPKCS7Encoder...

weixin_33411550的博客 456

S7-200 SMART PLC 数字量阀门控制功能块(FB)汇总

S7-200 SMART PLC功能块的各种写法可以查看专栏的其它文章,链接地址如下:S7-200 SMART PLC 子程序功能块(阀门控制)_RXXW_Dor的博客-优快云博客_plc控制阀门开关程序由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 4000

微信小程序手机号java解密encryptedData

解析代码 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.AlgorithmParameters; import java.security.Security; import java.security.spec.AlgorithmParameterSpec; import java.

wuuqu 835

NVIDIA GR00T SONIC - 人形机器人强化学习全身控制入门教程(一)

SONIC 是一个类人行为基础模型,它为机器人提供了一套从大规模人类动作数据中学习而来的核心运动技能。与为每个动作单独构建控制器不同,SONIC 将动作追踪作为可扩展的训练任务,因此单一套统一策略即可产生自然的全身运动,并支持多种多样的行为。         🎯 主要特点: 🚶 自然的全身运动(行走、爬行、动态动作) 🎮 支持实时 VR 遥操作 🤖 高级规划与交互的基础 📦 即用型 C++ 推理栈

2506_90492529的博客 840

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

微信小程序java8 java7 java6 encryptedData 解密 异常处理

使用java8 java7 java6 解密微信小程序encryptedData可以回遇到一些错误 1.java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding 2.Java.security.NoSuchProviderException: no such...

weixin_34290352的博客 393

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java对微信小程序userInfo中encryptedData解密

0x01 分析 同一主体下微信小程序和微信公众号下,同一个用户在不同的公众平台下openid是不同的,但是unionid是相同的,因此若需要创建同主体跨公众平台的系统时候,用户的unionid一定要记录下来。我遇到的场景是小程序已经上线,但是公众号还没有推广,但是未来的运营计划是根据小程序的用户行为在微信公众号进行模板消息推送,因此需要首先收集微信小程序用户的unionid。 要收集unioni...

shixiansen6535的博客 2446

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【小程序】java 后台获取用户信息(解密encryptedData)

首先java 后端依赖两个jar &lt;dependency&gt; &lt;groupId&gt;org.codehaus.xfire&lt;/groupId&gt; &lt;artifactId&gt;xfire-core&lt;/artifactId&gt; &lt;version&gt;1.2.6&lt;/version&gt; &lt;/

wangjia55的专栏 2万+

JAVA 微信小程序 解密 用户信息encryptedData

为什么要发这一篇文章,我估计如果你们是通过搜索找到这篇文章的,我已经明白你的辛酸了。 不多说了,上代码(亲自实践可用): WeChatUtil

默默不代表沉默 6929

java微信小程序步数encryptedData和开放数据解密

前提: 三个参数, 1.sessionKey(拿openId的时候可以得到) 2.encryptedData(前端提供) 3.iv(前端提供) 一个类,一个方法。 1.类: import java.nio.charset.Charset; import java.util.Arrays; /** * 微信小程序加解密 * @author liuyazhuang * */ public class WxPKCS7Encoder { private static final Char

宁静致远 1682

JAVA解密微信小程序用户信息encryptedData方案

首先我相信当各位大佬看到这个文章的时候,应该看过很多关于java解密微信小程序用户信息的方案了。但是总会遇到一些问题,比如代码复制过来,导入正确的包也会遇到的问题拉~,这里我就发布一个自己遇到的问题,希望能帮助后面的人,这个坑很大哦~废话不多说,贴代码这个AES解密工具包,放在Util包下import java.security.AlgorithmParameters; import java.s...

Avery的博客 5578
上一篇: APK反编译
下一篇: 微信小程序登录Java后台接口(详解,附示例代码)
javaee1234
博客等级 码龄10年 49粉丝 24原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值