1. 程式人生 > >C# .net 填充無效,無法被移除 微信小程序解密失敗的解決辦法

C# .net 填充無效,無法被移除 微信小程序解密失敗的解決辦法

odi 獲取用戶信息 親測 字符串 nload form 由於 無效 ted

微信小程序獲取用戶信息諸如unionId的時候需要解密,如果遇到偶然的解密失敗(填充無效,無法被移除),原因很有可能是session_key錯誤,

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

技術分享圖片

C#解密代碼(親測有效,可以直接復制使用)

        /// <summary>
        /// Aes解密
        /// </summary>
        /// <param name="str">需要解密的字符串</param>
        /// <param name="key">
密鑰,長度不夠時空格補齊,超過時從左截取</param> /// <param name="iv">偏移量,長度不夠時空格補齊,超過時從左截取</param> /// <param name="keyLenth">秘鑰長度,16 24 32</param> /// <param name="aesMode">解密模式</param> /// <param name="aesPadding">填充方式</param> /// <returns></returns>
public static string AesDecode(string str, string key, string iv, int keyLenth = 16, CipherMode aesMode = CipherMode.CBC, PaddingMode aesPadding = PaddingMode.PKCS7) {
       if (!new List<int> { 16, 24, 32 }.Contains(keyLenth)) { return null;//密鑰的長度,16位密鑰 = 128位,24位密鑰 = 192位,32位密鑰 = 256位。
} var oldBytes = Convert.FromBase64String(str); var bKey = new Byte[keyLenth]; Array.Copy(Convert.FromBase64String(key.PadRight(keyLenth)), bKey, keyLenth); var bIv = new Byte[16]; Array.Copy(Convert.FromBase64String(iv.PadRight(16)), bIv, 16); var rijalg = new RijndaelManaged { Mode = aesMode, Padding = aesPadding, Key = bKey, IV = bIv, }; var decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV); var rtByte = decryptor.TransformFinalBlock(oldBytes, 0, oldBytes.Length); return Encoding.UTF8.GetString(rtByte); }

如果這個時候你解密報出錯誤:填充無效,無法被移除 原因:

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,最後再去解密.

C# .net 填充無效,無法被移除 微信小程序解密失敗的解決辦法