java 解密微信电话号码_Java解密微信小程序数据,获得手机号码

这篇博客详细介绍了如何使用Java解密微信小程序的数据,从而获取到用户的电话号码。通过解析官方文档并提供解密方法,包括数据校验、密钥和偏移量的使用,以及AES/CBC/PKCS7Padding解密过程,帮助开发者实现微信小程序用户信息的安全获取。
摘要由CSDN通过智能技术生成

微信官方文档地址

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

/**

* Description: 解密微信数据,获得手机号码

*

* @param data

* @param sessionid

* @return

* @throws Exception

*/

public String decrypt(String data, String sessionid) throws Exception {

// 传入参数JSON格式校验与转换

MapdataMap = JSONDataUtil.checkJSONData(data);

MapresultMap = new HashMap<>();

try {

// 检查map里字符串不能为空

String iv = MapUtil.checkStringExistMap(dataMap, "iv");// 偏移量

String sessionKey = MapUtil.checkStringExistMap(dataMap, "session_key");// 密钥

String encryptedData = MapUtil.checkStringExistMap(dataMap, "encryptedData");// 密文

// 解密

String deInfo = AesCbcUtil.decrypt(encryptedData, sessionKey, iv, "UTF-8");

if (deInfo == null) {

throw new Exception(-1, "用户信息解密失败");

}

MapinfoMap = JSONDataUtil.checkJSONData(deInfo);

if (StringUtils.isEmpty(infoMap.get("phoneNumber"))) {

throw new Exception(-1, "无法获得用户手机号");

}

resultMap.put("phone", infoMap.get("phoneNumber"));

return new RetStruct("解密成功", resultMap).toString();

} catch (Exception e) {

throw new Exception(e);

}

}

import java.security.AlgorithmParameters;

import java.security.Security;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class AesCbcUtil {

static {

// BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/

Security.addProvider(new BouncyCastleProvider());

}

/**

* AES解密

*

* @param data

* //密文,被加密的数据

* @param key

* //秘钥

* @param iv

* //偏移量

* @param encodingFormat

* //解密后的结果需要进行的编码

* @return

* @throws Exception

*/

public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {

// 被加密的数据

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) {

e.printStackTrace();

return null;

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值