博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信小程序 encryptedData 的解密(JAVA)
阅读量:5135 次
发布时间:2019-06-13

本文共 3134 字,大约阅读时间需要 10 分钟。

上图为微信官方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:
org.bouncycastle
bcprov-jdk15on
1.59

  

转载于:https://www.cnblogs.com/handsomejunhong/p/8670367.html

你可能感兴趣的文章
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
距离公式汇总以及Python实现
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
php match_model的简单使用
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
STM32单片机使用注意事项
查看>>