收藏
回答

wx.getUserinfo()分享之后解密的方法缺少C#版本的,请尽快解决

问题模块
API和组件


加密数据解密算法

接口如果涉及敏感数据(如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#版本的


最后一次编辑于  2017-05-22  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

12 个回答

  • What Does the Fox Say!
    What Does the Fox Say!
    2018-04-03

          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;

                    }

                } 

            }


    2018-04-03
    赞同
    回复
  • Tony Stark
    Tony Stark
    2018-03-02

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

    2018-03-02
    赞同
    回复
  • 阿勇
    阿勇
    2018-01-29

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

    2018-01-29
    赞同
    回复
  • 一切随风
    一切随风
    2018-01-15

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

    2018-01-15
    赞同
    回复
  • 夜未央
    夜未央
    2017-05-23

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

    2017-05-23
    赞同
    回复
  • 夜未央
    夜未央
    2017-05-23

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

    2017-05-23
    赞同
    回复
  • 路边摊儿小摇滚🏂🏹
    路边摊儿小摇滚🏂🏹
    2017-05-22

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

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


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


    2017-05-22
    赞同
    回复
  • 遇见@🐎💨
    遇见@🐎💨
    2017-05-22

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



    2017-05-22
    赞同
    回复
  • 夜未央
    夜未央
    2017-05-22

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

    2017-05-22
    赞同
    回复
  • 遇见@🐎💨
    遇见@🐎💨
    2017-05-22

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

    2017-05-22
    赞同
    回复

正在加载...