`

微信小程序解密数据(encryptData)

阅读更多

 

 /**
 * 对公众平台发送给公众账号的消息加解密示例代码.
 * 
 * @copyright Copyright (c) 1998-2014 Tencent Inc.
 */


import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * 提供基于PKCS7算法的加解密接口.
 */
class PKCS7Encoder {
	static Charset CHARSET = Charset.forName("utf-8");
	static int BLOCK_SIZE = 32;

	/**
	 * 获得对明文进行补位填充的字节.
	 * 
	 * @param count 需要进行填充补位操作的明文字节个数
	 * @return 补齐用的字节数组
	 */
	static byte[] encode(int count) {
		// 计算需要填充的位数
		int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
		if (amountToPad == 0) {
			amountToPad = BLOCK_SIZE;
		}
		// 获得补位所用的字符
		char padChr = chr(amountToPad);
		String tmp = new String();
		for (int index = 0; index < amountToPad; index++) {
			tmp += padChr;
		}
		return tmp.getBytes(CHARSET);
	}

	/**
	 * 删除解密后明文的补位字符
	 * 
	 * @param decrypted 解密后的明文
	 * @return 删除补位字符后的明文
	 */
	static byte[] decode(byte[] decrypted) {
		int pad = (int) decrypted[decrypted.length - 1];
		if (pad < 1 || pad > 32) {
			pad = 0;
		}
		return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
	}

	/**
	 * 将数字转化成ASCII码对应的字符,用于对明文进行补码
	 * 
	 * @param a 需要转化的数字
	 * @return 转化得到的字符
	 */
	static char chr(int a) {
		byte target = (byte) (a & 0xFF);
		return (char) target;
	}

}

 

 

 

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import com.alibaba.fastjson.JSONObject;

/**
 * 对微信小程序用户加密数据的解密示例代码.
 * 
 * @ClassName WXBizDataCrypt
 * @Description TODO(这里用一句话描述这个类的作用)
 * @author tf
 * @Date 2016年11月19日 下午2:56:36
 * @version 1.0.0
 */
@SuppressWarnings("restriction")
public class WXBizDataCrypt {
	/*
	 * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。
	 */
	private static WXBizDataCrypt instance = null;

	private WXBizDataCrypt() {

	}

	public static WXBizDataCrypt getInstance() {
		if (instance == null)
			instance = new WXBizDataCrypt();
		return instance;
	}

	/**
	 * 对于官方加密数据(encryptData)解密说明如下: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的
	 * openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(
	 * encryptedData )进行对称解密。 解密算法如下: 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
	 * 对称解密的目标密文为 Base64_Decode(encryptedData), 对称解密秘钥 aeskey =
	 * Base64_Decode(session_key), aeskey 是16字节 对称解密算法初始向量 iv 会在数据接口中返回。
	 * 
	 * @Description (TODO这里用一句话描述这个方法的作用)
	 * @param encryptedData
	 *            加密内容
	 * @param sessionKey
	 *            小程序登录sessionKey
	 * @param iv
	 *            解密算法初始向量 iv 会在数据接口中返回。
	 * @param encodingFormat
	 *            编码格式默认UTF-8
	 * @return 返回解密后的字符串
	 * @throws Exception
	 */
	public String decrypt(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception {
		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
			BASE64Decoder base64Decoder = new BASE64Decoder();
			byte[] _encryptedData = base64Decoder.decodeBuffer(encryptedData);
			byte[] _sessionKey = base64Decoder.decodeBuffer(sessionKey);
			byte[] _iv = base64Decoder.decodeBuffer(iv);
			SecretKeySpec secretKeySpec = new SecretKeySpec(_sessionKey, "AES");
			IvParameterSpec ivParameterSpec = new IvParameterSpec(_iv);
			cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
			byte[] original = cipher.doFinal(_encryptedData);
			byte[] bytes = PKCS7Encoder.decode(original);
			String originalString = new String(bytes, "UTF-8");
			return originalString;
		} catch (Exception ex) {
			return null;
		}
	}

	public static void main(String[] args) throws Exception {
		// 需要加密的字串
		// String appid = "wx4f4bc4dec97d474b";
		String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";

		String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM" + "QmRzooG2xrDcvSnxIMXFufNstNGTyaGS"
				+ "9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+" + "3hVbJSRgv+4lGOETKUQz6OYStslQ142d"
				+ "NCuabNPGBzlooOmB231qMM85d2/fV6Ch" + "evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6"
				+ "/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw" + "u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn"
				+ "/Hz7saL8xz+W//FRAUid1OksQaQx4CMs" + "8LOddcQhULW4ucetDf96JcR3g0gfRK4P"
				+ "C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB" + "6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns"
				+ "/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd" + "lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV"
				+ "oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG" + "20f0a04COwfneQAGGwd5oa+T8yO5hzuy" + "Db/XcxxmK01EpqOyuxINew==";

		String iv = "r7BXXKkLb8qrSNn05n0qiA==";
		String deString = WXBizDataCrypt.getInstance().decrypt(encryptedData, sessionKey, iv, "utf-8");
		JSONObject jsonObject = JSONObject.parseObject(deString);
		System.out.println(jsonObject);
	}
}

 

 

运行后的结果如下:

{"watermark":{"timestamp":1477314187,"appid":"wx4f4bc4dec97d474b"},"nickName":"Band","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0","province":"Guangdong","unionId":"ocMvos6NjeKLIBqg5Mr9QjxrP1FA","gender":1,"language":"zh_CN","country":"CN","city":"Guangzhou","openId":"oGZUI0egBJY1zhBYw2KhdUfwVJJE"}

 

 

 

分享到:
评论

相关推荐

    微信小程序 Cryptojs 解密工具包

    4. 加密/解密接口封装:为了方便在微信小程序中使用,这个工具包可能已经将CryptoJS的加密和解密方法进行了封装,提供更友好的API,例如`encryptData`和`decryptData`,使得开发者能够快速集成到自己的小程序项目中...

    Java解密微信小程序手机号的方法

    Java解密微信小程序手机号的方法 ...Java解密微信小程序手机号的方法主要通过创建AES解密工具类来实现,使用AES-128-CBC算法对微信数据进行解密。该方法具有较高的安全性和效率,可以满足实际应用中的需求。

    微信小程序获取微信运动步数的实例代码

    现在运动计步很火,无论是蚂蚁森林,还是微信上都很火爆,本文介绍了微信小程序微信运动步数的实例代码,分享给大家 微信小程序API-微信运动 ...思路:wx.login获取的code请求获取的session_key,wx.getWeRunData获取...

    RSA小程序项目加解密

    RSA小程序项目加解密是关于在微信小程序中应用RSA非对称加密算法来保障数据安全的重要实践。在当今数字化时代,信息安全成为了不可忽视的关键问题,尤其是在用户敏感信息传输时,如登录凭证、支付信息等。RSA算法...

    RAS加密在微信小程序中的使用

    微信小程序提供了JSAPI(JavaScript API)供开发者调用,其中包括了加密和解密的相关接口,如`wx.encryptData`和`wx.decryptData`。 1. **数据加密**:在发送敏感数据前,先使用RAS算法的公钥对数据进行加密,生成...

    微信小程序解密微信运动数据

    微信小程序API-微信运动https://mp.weixin.qq.com/debug/wxadoc/dev/api/we-run.html#wxgetwerundataobject思路:wx.login获取的code请求获取的session_key,wx.getWeRunData获取的iv,encryptData,将它们一起发送到...

    微信小程序用户信息encryptedData详解

    总结起来,微信小程序的`encryptedData`是用户信息的一种安全传递方式,通过AES-128-CBC加密算法和`session_key`以及`iv`进行解密,解密后的数据包含了用户的多个属性,同时提供数据校验机制以确保数据的完整性和...

    微信小程序 wx.login解密出现乱码的问题解决办法

    在微信小程序的开发过程中,`wx.login` 是一个至关重要的接口,它允许用户授权并获取登录凭证(code),以便进一步获取微信用户的基本信息。然而,有些开发者在使用此功能时可能会遇到解密用户数据时出现乱码的问题...

    微信小程序开发附源码:PHP后台实现微信小程序登录.doc

    在微信小程序开发中,实现用户登录是至关重要的一步,它涉及到用户身份的验证以及后续功能的正常使用。本文将详细介绍如何利用PHP作为后台服务器来处理微信小程序的登录流程,并附带相关源码。以下是对该过程的详细...

    滴滴拼车微信小程序.rar

    《滴滴拼车微信小程序开发详解》 在移动互联网时代,微信小程序因其轻量级、无需安装、即扫即用的特点,已经成为许多开发者和企业青睐的平台。本篇将深入探讨"滴滴拼车微信小程序"这一项目,从源码角度解析其在...

    小程序 AES的ECB加密模式

    【小程序 AES的ECB加密模式】是微信小程序在与后台数据交互时,为了保障信息安全而采用的一种加密技术。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛应用的块密码算法,以其高效和安全性著称。...

    PHP后台实现微信小程序登录

    以上代码展示了后端处理微信小程序登录请求的核心逻辑,包括通过`code`获取`session_key`和`openid`、校验签名以及使用微信官方提供的SDK解密用户数据。在实际的开发中,还需要考虑异常处理和安全验证等方面的问题,...

    微信小程序实战开发系列《四》用户信息encryptedData

    之前做过一个版本是根据encryptData和Session_key解密得到完整的用户信息(包含union_id)的方法去获取用户信息,由于小程序升级,如今需要废弃encryptData的方式去获取用户信息,改成使用encryptedData的方式获取...

    微信小程序--获取微信运动步数的实例代码

    现在运动计步很火,无论是蚂蚁森林,还是微信上都很火爆,本文介绍了微信小程序微信运动步数的实例代码,分享给大家 微信小程序API-微信运动  ...思路:wx.login获取的code请求获取的session_key,wx.getWeRunData获取...

    Payment_popup(支付键盘).zip

    微信小程序提供了加密和解密的API,如wx.encryptData和wx.decryptData,可以用来对敏感信息进行加密,防止在传输过程中被窃取。 7. **支付弹窗组件使用说明.txt**:这个文件很可能是指导开发者如何使用"Payment_...

    youjia.zip

    “youjia”小程序可能采用了微信授权登录的方式,利用微信开放平台提供的API,用户只需一键授权即可快速登录,同时也方便获取用户的微信基本信息,简化注册流程。在安全性方面,uni-app提供了加密解密方法,如`uni....

Global site tag (gtag.js) - Google Analytics