欢迎来到258分享网,纯净的网络源码分享基地!

258资源分享网

全部作品
全部作品
网站源码
微信源码
素材特效
源码插件
视频教程
建站学院
热门搜索: 织梦  农业种植  农业  安全设置  官方
258资源分享 > 建站学院 > 微信开发 > JAVA版微信小程序用户数据的签名验证和加解密

推荐下载

HTML5响应式自适应网咯设计

2020-05-12   浏览:736

高端HTML5响应式企业通用网

2020-05-06   浏览:517

html5响应式外贸网站英文版

2020-05-08   浏览:505

HTML5自适应律师工作室类网

2020-04-04   浏览:501

HTML5影视传媒文化公司类网

2020-05-12   浏览:495

JAVA版微信小程序用户数据的签名验证和加解密

发布时间:2020-10-30  

签名验证和加解密 数据签名校验

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

签名校验算法涉及用户的session_key,通过 wx.login 登录流程获取用户session_key,并自行维护与应用自身登录态的对应关系。

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

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

加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。解密算法如下:

对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。

对称解密的目标密文为 Base64_Decode(encryptedData),

对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节

对称解密算法初始向量 iv 会在数据接口中返回。

微信官方提供了多种编程语言的示例代码( 点击下载 ),但就是没提供JAVA版本的,可能的确PHP是最好的语言,腾讯提供的demo好多都是PHP版本的。

JAVA代码案例

pom.xml引入以下依赖:

<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.57</version> </dependency>

我们可以参考PHP给出的代码,使用JAVA实现: AESUtil:

import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; /** * AES解密 * 创建者 柒 * 创建时间 2018年3月12日 */ public class AESUtil { static { Security.addProvider(new BouncyCastleProvider()); } /** * AES解密 * @param content 密文 * @return * @throws InvalidAlgorithmParameterException * @throws NoSuchProviderException */ public static byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException { try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); Key sKeySpec = new SecretKeySpec(keyByte, "AES"); //生成iv AlgorithmParameters params = AlgorithmParameters.getInstance("AES"); params.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, sKeySpec, params);// 初始化 return cipher.doFinal(content); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } }

WXBizDataCrypt:

import java.io.UnsupportedEncodingException; import java.security.InvalidAlgorithmParameterException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; /** * 对微信小程序用户加密数据的解密 * 创建者 柒 * 创建时间 2018年3月12日 */ public class WXBizDataCrypt { public static String illegalAesKey = "-41001";//非法密钥 public static String illegalIv = "-41002";//非法初始向量 public static String illegalBuffer = "-41003";//非法密文 public static String decodeBase64Error = "-41004"; //解码错误 public static String noData = "-41005"; //数据不正确 private String appid; private String sessionKey; public WXBizDataCrypt(String appid, String sessionKey) { this.appid = appid; this.sessionKey = sessionKey; } /** * 检验数据的真实性,并且获取解密后的明文. * @param encryptedData string 加密的用户数据 * @param iv string 与用户数据一同返回的初始向量 * @return data string 解密后的原文 * @return String 返回用户信息 */ public String decryptData(String encryptedData, String iv) { if (StringUtils.length(sessionKey) != 24) { return illegalAesKey; } // 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。 byte[] aesKey = Base64.decodeBase64(sessionKey); if (StringUtils.length(iv) != 24) { return illegalIv; } // 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。 byte[] aesIV = Base64.decodeBase64(iv); // 对称解密的目标密文为 Base64_Decode(encryptedData) byte[] aesCipher = Base64.decodeBase64(encryptedData); try { byte[] resultByte = AESUtil.decrypt(aesCipher, aesKey, aesIV); if (null != resultByte && resultByte.length > 0) { String userInfo = new String(resultByte, "UTF-8"); JSONObject jsons = JSON.parseObject(userInfo); String id = jsons.getJSONObject("watermark").getString("appid"); if (!StringUtils.equals(id, appid)) { return illegalBuffer; } return userInfo; } else { return noData; } } catch (InvalidAlgorithmParameterException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * encryptedData 和 iv 两个参数通过小程序wx.getUserInfo()方法获取 * @param args * @see */ public static void main(String[] args) { 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=="; WXBizDataCrypt biz = new WXBizDataCrypt(appId, sessionKey); System.out.println(biz.decryptData(encryptedData, iv)); } }

本文标签

:备案管家服务帮您把复杂流程变简单,解决您在进行网站备案过程中遇到的效率低下和成功率不高的问题。个人300/2个域名,企业500/5个域名,qq1650004.