微信小程序解析用户加密数据

微信公众号 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

 

 

 

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Fiddler是一个流行的网络调试工具,常用于抓取HTTP和HTTPS流量,帮助开发者理解和调试Web应用。在抓取微信小程序数据时,由于微信小程序采用了特殊的通信协议(如WXML, WXSS, JavaScript Bundle等)和加密机制,直接使用Fiddler可能会遇到一些挑战: 1. **跨域限制**:微信小程序默认是不允许跨域请求的,你需要配置微信开发者工具的“安全域名”设置,才能允许特定域名的请求被Fiddler截获。 2. **加密处理**:微信提供了自家的加密套件,如TLS 1.3和随机数生成,这可能使Fiddler难以直接解析响应内容,你可能需要解密工具或者了解微信的安全策略。 3. **特殊接口**:微信小程序数据请求可能通过微信提供的API或者其他自定义接口,这些接口通常是隐藏的或有权限限制,Fiddler可能无法直接跟踪。 4. **调试工具**:微信提供了微信开发者工具,其中内置了调试网络的能力,你可以尝试在开发工具中查看和调试小程序数据交互。 **步骤概述**: - 配置微信开发者工具:确保你已经设置了正确的安全域名,并开启调试模式。 - 使用微信开发者工具的网络面板:在模拟器或真机上查看小程序数据请求。 - 如果需要抓取,可以在开发者工具的请求日志中找到相关请求,然后在Fiddler中设置代理服务器(比如127.0.0.1:8888)来拦截并分析请求。 **相关问题**: 1. 如何在微信开发者工具中设置安全域名? 2. 微信小程序的加密套件具体是什么? 3. Fiddler如何设置代理服务器来拦截微信请求?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT果果日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值