精华内容
下载资源
问答
  • 微信小程序加密数据解密算法Go语言版 微信小程序开发官方说明文档 - 签名加密篇文档链接 1. 最早的文档链接(已失效) 2. 旧文档链接(已失效) 3. 最新文档链接(当前官方最新文档) 使用方法 go get github....
  • 微信小程序加密数据解密算法Go版
  • 这是一个java解密小程序的一个例子,希望可以帮到大家。
  • NULL 博文链接:https://bijian1013.iteye.com/blog/2427653
  • 微信小程序加密字段解密工具代码,真的没搞懂微信怎么想的,微信退款,公众号消息,小程序,微信支付的加密解密方式全都不一样,每一个都要单独调试,简直要死人,那我就调试好一个就传一个上来
  • 主要为大家详细介绍了java实现微信小程序加密数据解密算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java微信小程序加密数据解密 可以直接使用可以直接使用可以直接使用可以直接使用可以直接使用可以直接使用
  • 小程序开发 crypto-js 报错 加密 解密 maximum call stack size exceeded
  • 微信小程序开发--实现密码加密具体步骤: 在utils中的util.js 文件中增加 函数 实现 字符串转换为16进制加密后的字符串 function encodeUTF8(s) { var i, r = [], c, x; for (i = 0; i < s xss=removed>> 6 & 0x1F...
  • 微信小程序aes加密解密文件,直接能用,地址是http://blog.csdn.net/qq_35713752/article/details/79631377
  • 微信小程序加密数据解密算法wechat-aes-sample-master.zip
  • 主要介绍了微信小程序 MD5加密登录密码详解及实例代码的相关资料,这里附有实例代码,需要的朋友可以参考下
  • 微信小程序MD5加密。如返回乱码,请检查返回json格式是否正确。如返回为整个接口页面html文件,请设置wx.request, header: { 'content-type': 'application/x-www-form-urlencoded', 'Accept': 'application/json...
  • 微信小程序使用的开发语言是js,网上找到js实现md5加密的代码,融合进小程序内使用 在utils目录下新建md5.js文件   function safeAdd (x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF) var msw = (x >> 16) + (y >>...
  • 微信小程序加密数据解密

    千次阅读 2020-08-19 15:26:12
    我们在获取到小程序加密数据后,首先做的是校验数据,校验通过后进行数据的解密 一、新建小程序用户隐私数据解密工具类 /** * @Author: zp.wei * @DATE: 2020/7/7 14:47 */ public class WXBizDataUtil {...

    我们在获取到小程序的加密数据后,首先做的是校验数据,校验通过后进行数据的解密

    一、新建小程序用户隐私数据解密工具类

    /**
     * @Author: zp.wei
     * @DATE: 2020/7/7 14:47
     */
    public class WXBizDataUtil {
    
        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 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;
        }
    
    }

    二、在controller相关方法里调用该工具类下的 decryptData 方法,即下面代码所示

    private JSONObject getUserInfo(String iv, String encryptedData, String sessionKey) {
            String userInfo = null;
            //解密数据
            try {
                WXBizDataCrypt biz = new WXBizDataCrypt(CommonConfig.appletAppID, sessionKey);
                userInfo = biz.decryptData(encryptedData, iv);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return JSONObject.parseObject(userInfo);
        }

    最后获取到的 userInfo 就是解密后的用户隐私数据了

    展开全文
  • Go 语言 微信小程序加密数据解密算法实现 代码实现 本实现参考官方PHP例程实现,Go代码实现如下: func DecryptData (app_id, session_key, iv, encrypted_data string) (map[string]interface{}, error) { ...

    Go 语言 微信小程序加密数据解密算法实现

    代码实现

    本实现参考官方PHP例程实现,Go代码实现如下:

    func DecryptData (app_id, session_key, iv, encrypted_data string) (map[string]interface{}, error) {
    	if len := strings.Count(session_key, "") - 1; len != 24 {
    		return nil, errors.New("Invalid value session_key!")
    	}
    	aesKey, err := base64.StdEncoding.DecodeString(session_key)
    	if err != nil {
    		return nil, err
    	}
    
    	if len := strings.Count(iv, "") - 1; len != 24 {
    		return nil, errors.New("Invalid value iv!")
    	}
    	ivKey, err := base64.StdEncoding.DecodeString(iv)
    	if err != nil {
    		return nil, err
    	}
    
    	decodeData, err := base64.StdEncoding.DecodeString(encrypted_data)
    	if err != nil {
    		return nil, err
    	}
    
    	dataBytes, err := AesDecrypt(decodeData, aesKey, ivKey)
    	if err != nil {
    		return nil, err
    	}
    
    	var result map [string] interface{}
    	err = json.Unmarshal(dataBytes, &result)
    
    	watermark := result["watermark"].(map[string]interface{})
    	if watermark["appid"] != app_id {
    		return nil, errors.New("Invalid appid data!")
    	}
    
    	return result, err
    }

    参考

    AES解密算法实现参考:golang版微信小程序登录和ase解码微信公开数据,稍作修改,代码如下:

    func AesDecrypt(crypted, key, iv []byte) ([]byte, error) {
    	block, err := aes.NewCipher(key)
    	if err != nil {
    		return nil, err
    	}
    
    	blockMode := cipher.NewCBCDecrypter(block, iv)
    	origData := make([]byte, len(crypted))
    	blockMode.CryptBlocks(origData, crypted)
    	
        // 去除填充
    	length := len(origData)
    	unp := int(origData[length-1])
    	return origData[:(length - unp)], nil
    }
    展开全文
  • 获取微信程序人员信息之后,会给一个加密字符串,这个时候,前端不太好解密,因为浪费性能,会请求后端解密,那么后端如何解密呢?demo来说话; 1、首先工具类 package com.XXX.member.utils; import ...

      获取微信程序人员信息之后,会给一个加密字符串,这个时候,前端不太好解密,因为浪费性能,会请求后端解密,那么后端如何解密呢?demo来说话;

    1、首先工具类

    package com.XXX.member.utils;
    
    
    import com.alibaba.fastjson.JSONObject;
    import lombok.Data;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.AlgorithmParameters;
    import java.security.Key;
    import java.security.Security;
    import java.util.Base64;
    
    /**
     * 小程序 AES 解密工具
     *
     * @author Kilde
     */
    @Data
    public class WXBizDataCrypt {
    
    //    public static void main(String[] args) {
    //
    //        String appId = "wx4f4bc4dec97d474b";
    //        String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
    //        String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
    //        String iv = "r7BXXKkLb8qrSNn05n0qiA==";
    //
    //        WXBizDataCrypt pc = new WXBizDataCrypt(appId,sessionKey);
    //        JSONObject decrypt = pc.decrypt(encryptedData, iv);
    //
    //        System.out.println(decrypt.toString());
    //
    //    }
    
    
        public static JSONObject getMoreInfoFromEncryptedData(String appId, String sessionKey, String encryptedData, String iv) {
            WXBizDataCrypt pc = new WXBizDataCrypt(appId, sessionKey);
            JSONObject decrypt = pc.decrypt(encryptedData, iv);
            return decrypt;
        }
    
        private String appId;
        private String sessionKey;
    
        public WXBizDataCrypt(String appId, String sessionKey) {
            this.appId = appId;
            this.sessionKey = sessionKey;
        }
    
    
        /**
         * 解密成json
         *
         * @param encryptedData
         * @param iv
         * @return
         */
        public JSONObject decrypt(String encryptedData, String iv) {
            byte[] encryptedDataDecode = Base64.getDecoder().decode(encryptedData);
            byte[] sessionKeyDecode = Base64.getDecoder().decode(this.sessionKey);
            byte[] ivDecode = Base64.getDecoder().decode(iv);
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            byte[] decodeData = decode(encryptedDataDecode, sessionKeyDecode, ivDecode);
            String stringData = new String(decodeData);
            JSONObject jsonObject = JSONObject.parseObject(stringData);
            return jsonObject;
        }
    
    
        /**
         * 解密算法 AES-128-CBC
         * 填充模式 PKCS#7
         *
         * @param encryptedDataDecode 目标密文
         * @return
         * @throws Exception
         */
        private byte[] decode(byte[] encryptedDataDecode, byte[] sessionKeyDecode, byte[] iv) {
            try {
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
                Key sKeySpec = new SecretKeySpec(sessionKeyDecode, "AES");
                cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(iv));// 初始化
                byte[] result = cipher.doFinal(encryptedDataDecode);
                return result;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 处理iv
         *
         * @param iv
         * @return
         * @throws Exception
         */
        private AlgorithmParameters generateIV(byte[] iv) throws Exception {
            AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
            params.init(new IvParameterSpec(iv));
            return params;
        }
    
    }

    2、真正的代码

     @Transactional(rollbackFor = Exception.class)
        @Override
        public JsonResult<UserInfoVoWeChatInfoDTO> saveAcode2SessionUserInfo(UserInfoVoWeChatInfoVO userInfoVoWeChatInfoVO) {
            if (Objects.isNull(userInfoVoWeChatInfoVO)) {
                return new JsonResult(JsonResultEnum.ARGS_NOT_FULL);
            }
            String encryptedData = userInfoVoWeChatInfoVO.getEncryptedData();
            Integer flag = userInfoVoWeChatInfoVO.getFlag();
            String iv = userInfoVoWeChatInfoVO.getIv();
            String sessionKey = userInfoVoWeChatInfoVO.getSessionKey();
            String openId = userInfoVoWeChatInfoVO.getOpenId();
            if (StringUtils.isBlank(encryptedData) ||
                    StringUtils.isBlank(iv) ||
                    StringUtils.isBlank(sessionKey) ||
                    StringUtils.isBlank(openId) ||
                    Objects.isNull(flag)) {
                return new JsonResult(JsonResultEnum.ARGS_NOT_FULL);
            }
            UserInfoVo userInfoVo = UserInfoVo.builder().build();
            String userPhone = userInfoVo.getUserPhone();
            String wechatAvatar = userInfoVo.getWechatAvatar();
            String wechatNickname = userInfoVo.getWechatNickname();
            String wechatOpenid = userInfoVo.getWechatOpenid();
            /**
             * 用户信息的
             * {"country":"CN","unionId":"ocMvos6NjeKLIBqg5Mr9QjxrP1FA","watermark":{"appid":"wx4f4bc4dec97d474b","timestamp":1477314187},"gender":1,"province":"Guangdong","city":"Guangzhou","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0","openId":"oGZUI0egBJY1zhBYw2KhdUfwVJJE","nickName":"Band","language":"zh_CN"}
             *
             * 手机号的
             *
             * {"phoneNumber":"186168383*2","watermark":{"appid":"wxf0e8d778d88e861b","timestamp":1598263205},"purePhoneNumber":"18616838312","countryCode":"86"}
             *
             */
            if (flag.equals(NumberUtils.INTEGER_ONE)) {
                JSONObject moreInfoFromEncryptedDataJosn =
                        WXBizDataCrypt.getMoreInfoFromEncryptedData(appid, sessionKey, encryptedData, iv);
                //优先选这个
                userPhone = String.valueOf(moreInfoFromEncryptedDataJosn.get("phoneNumber"));
                userPhone = StringUtils.isBlank(userPhone) ? String.valueOf(moreInfoFromEncryptedDataJosn.get("purePhoneNumber")) : userPhone;
                wechatOpenid = openId;
            } else if (flag.equals(NumberUtils.INTEGER_TWO)) {
                JSONObject moreInfoFromEncryptedDataJosn =
                        WXBizDataCrypt.getMoreInfoFromEncryptedData(appid, sessionKey, encryptedData, iv);
                wechatAvatar = moreInfoFromEncryptedDataJosn.getString("avatarUrl");
                wechatNickname = moreInfoFromEncryptedDataJosn.getString("nickName");
                wechatOpenid = openId;
            }
    
            UserInfo userInfo = userInfoMapper.selectUserInfo(openId, userPhone);
            if (Objects.isNull(userInfo)) {
                //等获取到再补充更正
                UserInfo build = UserInfo.builder()
                        .userMoney(0)
                        .userName("0")
                        .userPhone(StringUtils.isBlank(userPhone) ? "0" : userPhone)
                        .wechatNickname(StringUtils.isBlank(wechatNickname) ? "0" : wechatNickname)
                        .wechatAvatar(StringUtils.isBlank(wechatAvatar) ? "0" : wechatAvatar)
                        .wechatOpenid(openId)
                        .build();
                int i = userInfoMapper.insertUser(build);
                if (i != 1) {
                    log.error("小程序获取Acode2Session信息保存失败---build:{}", JSON.toJSONString(build));
                    return JsonResult.error(JsonResultEnum.EXCEPTION_ERROR.getMsg());
                }
    
            } else if (Objects.nonNull(userInfo) && StringUtils.isNotBlank(wechatNickname) &&  StringUtils.isNotBlank(wechatAvatar)) {
    
                userInfo.setUserPhone(StringUtils.isBlank(userPhone) ? "0" : userPhone);
                userInfo.setWechatNickname(wechatNickname);
                userInfo.setWechatAvatar(wechatAvatar);
                int i = userInfoMapper.updateByPrimaryKeySelective(userInfo);
                if (i != 1) {
                    log.error("完善微信授权信息失败---build:{}", JSON.toJSONString(userInfo));
                    return JsonResult.error(JsonResultEnum.EXCEPTION_ERROR.getMsg());
                }
            }
            if (flag.equals(NumberUtils.INTEGER_ONE)) {
                UserInfoVoWeChatInfoDTO resultObject = UserInfoVoWeChatInfoDTO.builder()
                        .phone(userPhone)
                        .openId(openId)
                        .build();
                return new JsonResult(JsonResultEnum.SUCCESS, resultObject);
            } else if (flag.equals(NumberUtils.INTEGER_TWO)) {
                UserInfoVoWeChatInfoDTO resultObject = UserInfoVoWeChatInfoDTO.builder().phone(userPhone)
                        .wechatAvatar(wechatAvatar)
                        .wechatNickname(wechatNickname)
                        .phone(userInfo.getUserPhone())
                        .openId(openId).build();
                return new JsonResult(JsonResultEnum.SUCCESS, resultObject);
            }
            return JsonResult.seccess();
        }

     

    展开全文
  • Java之——实现微信小程序加密数据解密算法

    万次阅读 多人点赞 2018-03-05 20:08:38
    一、概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP、H5、还接入了小程序开发。但是,小程序中竟然没有提供Java版本的加密数据解密算法...微信小程序提供的加密数据解密算法链接为:https://mp.weixin...

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79450115

    一、概述

    微信推出了小程序,很多公司的客户端应用不仅具有了APP、H5、还接入了小程序开发。但是,小程序中竟然没有提供Java版本的加密数据解密算法。这着实让广大的Java开发人员蛋疼。

    微信小程序提供的加密数据解密算法链接为:https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

    最新地址为:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

    我们下载的算法示例如下:

    木有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版小程序加密数据解密算法结果一致。

     

    展开全文
  • 加密解密使用方法详见我的博客文章:https://blog.csdn.net/qq_35713752/article/details/82840185
  • 支持中文的md5加密,下载好直接放在项目中,新建md5.js文件,直接复制到项目的utils/md5.js即可
  • 加密: 154,93,155,110,7,62,192,159,144,127,98,35,24,83,18,98 解密: 17,34,51,68,85,102,119,136,153,136,119,102,85,68,51,34 与c及java的AES 128 ECB Nopadding加密结果相同(由本人通过c文件aes.c转为aes.js,...
  • 小程序登录时,小程序端请求地址为 url: 'http://localhost:9999/jiemi',后端在cmd运行demo.js文件,代码为node demo.js
  • 下载解压文件里边了两个文件一个前端js加密一个.net C#加密
  • 首先吐槽一下,微信小程序这个设计,其实密文中包含的用于开发的有用信息并不是很多。 解密后的类似:     {"openId":"oy9H90Nqxxxxxxxxxxx0BJmuw",   "nickName":"xxxxxxxxx",   "gender":1,   "language":"zh...
  • 微信小程序加密消息解密工具类

    千次阅读 2019-05-30 13:43:49
    开发者后台校验与解密开放数据 微信会对这些开放数据做签名和加密处理。开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被...为了数据不被篡改,开发者不应该把 session_key 传到小程序客户端...
  • 微信小程序AES加密ECB模式 工具类 附带 加密js文件,同javaAES加密ECB模式
  • (去掉注释13.6kb)微信小程序RSA加密模块,用法请参考文件里面的注释。 //加载RSA模块 var RSA = require('rsa.js'); var rsa_res = new RSA.RSAKey(); //配置公钥证书 let public_n = ''; let public_e = ''; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,816
精华内容 10,726
关键字:

微信小程序加密

微信小程序 订阅