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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM