zoukankan      html  css  js  c++  java
  • C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法

    微信小程序获取用户信息诸如unionId的时候需要解密,如果遇到偶然的解密失败(填充无效,无法被移除),原因很有可能是session_key错误,

    也是就你用作解密的session_key并不是微信用作加密的那个了,但是并不代表你的session_key已经失效.

    C#解密代码(亲测有效,可以直接复制使用)

     1   /// <summary>
     2         /// Aes解密
     3         /// </summary>
     4         /// <param name="str">需要解密的字符串</param>
     5         /// <param name="key">密钥,长度不够时空格补齐,超过时从左截取</param>
     6         /// <param name="iv">偏移量,长度不够时空格补齐,超过时从左截取</param>
     7         /// <param name="keyLenth">秘钥长度,16 24 32</param>
     8         /// <param name="aesMode">解密模式</param>
     9         /// <param name="aesPadding">填充方式</param>
    10         /// <returns></returns>
    11         public static string AesDecode(string str, string key, string iv, int keyLenth = 16, CipherMode aesMode = CipherMode.CBC, PaddingMode aesPadding = PaddingMode.PKCS7)
    12         {
    13        if (!new List<int> { 16, 24, 32 }.Contains(keyLenth))
    14             {
    15                 return null;//密钥的长度,16位密钥 = 128位,24位密钥 = 192位,32位密钥 = 256位。
    16             }
    17             var oldBytes = Convert.FromBase64String(str);
    18             var bKey = new Byte[keyLenth];
    19             Array.Copy(Convert.FromBase64String(key.PadRight(keyLenth)), bKey, keyLenth);
    20             var bIv = new Byte[16];
    21             Array.Copy(Convert.FromBase64String(iv.PadRight(16)), bIv, 16);
    22 
    23             var rijalg = new RijndaelManaged
    24             {
    25                 Mode = aesMode,
    26                 Padding = aesPadding,
    27                 Key = bKey,
    28                 IV = bIv,
    29             };
    30             var decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV);
    31             var rtByte = decryptor.TransformFinalBlock(oldBytes, 0, oldBytes.Length);
    32             return Encoding.UTF8.GetString(rtByte);
    33         }

    如果这个时候你解密报出错误:填充无效,无法被移除 原因:

    1. 如果一次都没有成功过,检查你的代码,或者把上面的代码拷过去

    2. 偶然遇到此bug,这个是重点,你就不要去网上找什么其他方案了.也不要再去检查你的代码了.问题的原因出在微信.

    加密过程是这样的:

    session_key + iv = encryptedData;

    由于 iv 和 encryptedData 是从wx.getUserInfo()或者是点击<button open-type=‘getUserInfo‘ >获取的,所以没有什么问题,问题出在 你获取的session_key 失效了

    调用wx.login()可能会触发session_key 刷新,如果你是先获取到iv和encryptedData,再去获取session_key ,那么你获取到的session_key 就可能已经不是加密用的那个session_key 了.

    我之所以用到了可能是因为我通过测试,发现先获取到iv和encryptedData,再去获取session_key这种方式并不是每次都失效,而是偶尔错误,并不知道微信如何去触发session_key,似乎也不像文档里写的那样

    解决方案:

     1. 如果你是老的小程序,用wx.getUserInfo()获取encryptedData只需要先wx.login(),再wx.getUserInfo()就可以了.

     2. 如果你是新开发的小程序,微信已经更改的授权方式,是通过<button open-type=‘getUserInfo‘ >这种方式获取授权的,建议:

    在登录页 onload 的时候调用wx.login().将openId和session_key 先缓存下来(session_key 建议缓存到后台),然后引导用户点击<button open-type=‘getUserInfo‘ >获取encryptedData,最后再去解密.

    原文地址:https://www.cnblogs.com/fancyblogs/p/9560268.html

  • 相关阅读:
    .net 中文显示乱码问题(Chinese display with messy code)
    Compare the value of entity field.
    人见人爱A^B 题解
    人见人爱A-B 题解
    全局变量
    第39级台阶 题解
    马虎的算式 题解
    做题技巧
    inline用法
    queue函数用法
  • 原文地址:https://www.cnblogs.com/shenghuotaiai/p/10769894.html
Copyright © 2011-2022 走看看