java实现微信小程序加密数据解密算法
程序员文章站
2024-03-31 14:03:28
一、概述
微信推出了小程序,很多公司的客户端应用不仅具有了app、h5、还接入了小程序开发。但是,小程序中竟然没有提供java版本的加密数据解密算法。这着实让广大的jav...
一、概述
微信推出了小程序,很多公司的客户端应用不仅具有了app、h5、还接入了小程序开发。但是,小程序中竟然没有提供java版本的加密数据解密算法。这着实让广大的java开发人员蛋疼。
微信小程序提供的加密数据解密算法
我们下载的算法示例如下:
木有java!! 木有java!! 木有java!!
那么如何解决这个问题,我们一起来实现java版本的微信小程序加密数据解密算法。
二、实现java版本的微信小程序加密数据解密算法
1、创建项目
这里,我们创建一个maven工程,具体创建步骤略。
2、配置pom.xml
我们在pom.xml中加入如下配置。
<dependency> <groupid>org.bouncycastle</groupid> <artifactid>bcprov-jdk16</artifactid> <version>1.46</version> </dependency> <dependency> <groupid>commons-codec</groupid> <artifactid>commons-codec</artifactid> <version>1.4</version> </dependency> <dependency> <groupid>net.sf.json-lib</groupid> <artifactid>json-lib</artifactid> <version>2.2.3</version> <classifier>jdk15</classifier> </dependency>
3、实现aes类
package com.chwl.medical.crypto.wx; 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; import org.bouncycastle.jce.provider.bouncycastleprovider; /** * aes加密 * @author liuyazhuang * */ public class aes { public static boolean initialized = false; /** * aes解密 * * @param content * 密文 * @return * @throws invalidalgorithmparameterexception * @throws nosuchproviderexception */ public byte[] decrypt(byte[] content, byte[] keybyte, byte[] ivbyte) throws invalidalgorithmparameterexception { initialize(); try { cipher cipher = cipher.getinstance("aes/cbc/pkcs7padding"); key skeyspec = new secretkeyspec(keybyte, "aes"); cipher.init(cipher.decrypt_mode, skeyspec, generateiv(ivbyte));// 初始化 byte[] result = cipher.dofinal(content); return result; } 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 (nosuchproviderexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } return null; } public static void initialize() { if (initialized) return; security.addprovider(new bouncycastleprovider()); initialized = true; } // 生成iv public static algorithmparameters generateiv(byte[] iv) throws exception { algorithmparameters params = algorithmparameters.getinstance("aes"); params.init(new ivparameterspec(iv)); return params; } }
4、实现wxpkcs7encoder类
package com.chwl.medical.crypto.wx; import java.nio.charset.charset; import java.util.arrays; /** * 微信小程序加解密 * @author liuyazhuang * */ public class wxpkcs7encoder { private static final charset charset = charset.forname("utf-8"); private static final int block_size = 32; /** * 获得对明文进行补位填充的字节. * * @param count * 需要进行填充补位操作的明文字节个数 * @return 补齐用的字节数组 */ public 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 删除补位字符后的明文 */ public static byte[] decode(byte[] decrypted) { int pad = decrypted[decrypted.length - 1]; if (pad < 1 || pad > 32) { pad = 0; } return arrays.copyofrange(decrypted, 0, decrypted.length - pad); } /** * 将数字转化成ascii码对应的字符,用于对明文进行补码 * * @param a * 需要转化的数字 * @return 转化得到的字符 */ public static char chr(int a) { byte target = (byte) (a & 0xff); return (char) target; } }
5、实现wxcore类
这个类主要是对具体算法的封装,统一对外提供方法。
package com.chwl.medical.crypto.wx; import org.apache.commons.codec.binary.base64; import net.sf.json.jsonobject; /** * 封装对外访问方法 * @author liuyazhuang * */ public class wxcore { private static final string watermark = "watermark"; private static final string appid = "appid"; /** * 解密数据 * @return * @throws exception */ public static string decrypt(string appid, string encrypteddata, string sessionkey, string iv){ string result = ""; try { aes aes = new aes(); byte[] resultbyte = aes.decrypt(base64.decodebase64(encrypteddata), base64.decodebase64(sessionkey), base64.decodebase64(iv)); if(null != resultbyte && resultbyte.length > 0){ result = new string(wxpkcs7encoder.decode(resultbyte)); jsonobject jsonobject = jsonobject.fromobject(result); string decryptappid = jsonobject.getjsonobject(watermark).getstring(appid); if(!appid.equals(decryptappid)){ result = ""; } } } catch (exception e) { result = ""; e.printstacktrace(); } return result; } public static void main(string[] args) throws exception{ string appid = "wx4f4bc4dec97d474b"; string encrypteddata = "ciylu1aw2kjvrjmdj8ykliajtp4gsmzmqmrzoog2xrdcvsnximxfufnstngtyags9ut5gera0w4otob1wt7fjlac+onpdbb+3hvbjsrgv+4lgoetkuqz6oystslq142dncuabnpgbzlooomb231qmm85d2/fv6chevvxvqp8hkue1pooftnetpyxvlw1zao6/1xx1coxfvrc2d7ul/lmhinnlxuacjxwu0fjpxfz/yqyzbibzd6wuftif9grhpon/hz7sal8xz+w//frauid1oksqaqx4cms8loddcqhulw4ucetdf96jcr3g0gfrk4pc7e/r7z6xnrxd2uieorgj5ef7b1pjayb6y5anahqz9j6nkebvb4dnnlivwsgarns/8wr2sirs7mnacwtyrgvt9ts8p12pkfdlqytopnhr1vf7xjfhqlvsajdnikdymyvoklarv85ifvunyzo0ikxsyl7jcujcpog20f0a04cowfneqaggwd5oa+t8yo5hzuydb/xcxxmk01epqoyuxinew=="; string sessionkey = "tiihtnczf5v6akryjweuhq=="; string iv = "r7bxxkklb8qrsnn05n0qia=="; system.out.println(decrypt(appid, encrypteddata, sessionkey, iv)); } }
三、测试
1、运行java版微信小程序加密数据解密算法
这里我们就直接运行wxcore类的main方法,这里的测试数据都是从python版微信小程序加密数据解密算法的示例程序中提出来的。我们的运行结果如下:
复制代码 代码如下:
{"openid":"ogzui0egbjy1zhbyw2khdufwvjje","nickname":"band","gender":1,"language":"zh_cn","city":"guangzhou","province":"guangdong","country":"cn","avatarurl":"http://wx.qlogo.cn/mmopen/vi_32/askcbbppibyknichntmm0qjvh8kjgiak2ahwr8mhm4wgmem7gfhsf8oyrysdbvamvtsw3mo8ibkicsnfn5prjl1p8hq/0","unionid":"ocmvos6njeklibqg5mr9qjxrp1fa","watermark":{"timestamp":1477314187,"appid":"wx4f4bc4dec97d474b"}}
2、运行python版微信小程序加密数据解密算法
这里我们在python环境中直接运行微信官方提供的python版小程序加密数据解密算法,结果如下:
复制代码 代码如下:
{u'province': u'guangdong', u'openid': u'ogzui0egbjy1zhbyw2khdufwvjje', u'language': u'zh_cn', u'city': u'guangzhou', u'gender': 1, u'avatarurl': u'http://wx.qlogo.cn/mmopen/vi_32/askcbbppibyknichntmm0qjvh8kjgiak2ahwr8mhm4wgmem7gfhsf8oyrysdbvamvtsw3mo8ibkicsnfn5prjl1p8hq/0', u'watermark': {u'timestamp': 1477314187, u'appid': u'wx4f4bc4dec97d474b'}, u'country': u'cn', u'nickname': u'band', u'unionid': u'ocmvos6njeklibqg5mr9qjxrp1fa'}
通过对比以上结果可知,我们自行使用java实现的java版微信小程序加密数据解密算法与微信官方提供的python版小程序加密数据解密算法结果一致。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: java导出Excel文件的步骤全纪录
下一篇: 浅谈java中守护线程与用户线程