wx.getUserinfo()分享之后解密的方法缺少C#版本的,请尽快解决
发布于 5 年前 作者 itang 15394 次浏览 来自 问答

加密数据解密算法

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

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

  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。

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

  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。

另外,为了应用能校验数据的有效性,我们会在敏感数据加上数据水印( watermark )


微信官方提供了多种编程语言的示例代码只有C++,Nodejs,PHP,Pyhton,缺少C#版本的

10 回复

还有就是您得解密之后的数据是字节数组,而官方给出的答案是json数据,不一致

根据网上的例子写了一个,测试的是正确的,但不保证,毕竟不是官方的。。。

也没有java和js版本啊,比如,我需要把用户填写的信息用js加密,服务器端解密,用户重要数据服务器端加密,js端解密(防止抓包)

这个最好还是官方给出DEMO比较好,自己写的不一定好

一样遇到这个问题,很一直没有解决

我也是 用这个方法 但是 有的账户就可以解密 有的 就抱错

在    byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);


System.Security.Cryptography.CryptographicException: 填充无效,无法被移除。 有人知道这个问题么

填充无效,无法被移除 这个有解决的吗?

      public static string WXBizDataCrypt(string encrypted, string session_key, string iv)

        {

            //创建解密器生成工具实例  

            using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())

            {

                aes.Mode = CipherMode.CBC;

                aes.BlockSize = 128;

                aes.Padding = PaddingMode.PKCS7;

                //设置解密器参数  

                //格式化待处理字符串  

                byte[] byte_encryptedData = Convert.FromBase64String(encrypted);

                byte[] byte_iv = Convert.FromBase64String(iv);

                byte[] byte_sessionKey = Convert.FromBase64String(session_key);

                aes.IV = byte_iv;

                aes.Key = byte_sessionKey;

                //根据设置好的数据生成解密器实例  

                using (ICryptoTransform transform = aes.CreateDecryptor())

                {

                    //解密  

                    byte[] final = transform.TransformFinalBlock(byte_encryptedData, 0, byte_encryptedData.Length);

                    //生成结果  

                    string result = Encoding.UTF8.GetString(final);

                    return result;

                }

            } 

        }

参照其他的代码的时候,会发现有一个方法WXBizDataCrypt oWXBizDataCrypt(Appid, Session_key);然后才是WXBizDataCrypt.DecryptData(EncryptedData, Iv),这个5楼提供的方法不一致,这样解密的正确性不一定很高

虽然实现算法不需要自己写,但是怎么写得正确,还是需要参考官方的例子

回到顶部