.NET Core 對接微信小程序數據解密


初次遇到需要數據解密的地方是在“獲取手機號”,前端組件調用后獲得的是加密數據,需要發送到服務端進行解密。

對於解密算法,微信官方文檔有以下說明:

  1. 對稱解密使用的算法為 AES-128-CBC,數據采用PKCS#7填充。
  2. 對稱解密的目標密文為 Base64_Decode(encryptedData)。
  3. 對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節。
  4. 對稱解密算法初始向量 為Base64_Decode(iv),其中iv由數據接口返回。

官方文檔提供了一些示例,但是沒有C#的,不過沒關系,此算法 .NET Core BCL包含了的,使用非常簡單。下面我封裝了一個方法:

/// <summary>
/// 解密微信數據
/// </summary>
/// <param name="encryptedData">加密的數據</param>
/// <param name="encryptIv">iv向量</param>
/// <param name="sessionKey">調用 wx auth.code2Session 來獲得</param>
/// <returns></returns>
public static string WechatDecrypt(string encryptedData, string encryptIv, string sessionKey)
{
    //base64解碼為字節數組
    var encryptData = Convert.FromBase64String(encryptedData);
    var key = Convert.FromBase64String(sessionKey);
    var iv = Convert.FromBase64String(encryptIv);

    //創建aes對象
    var aes = Aes.Create();

    if (aes == null)
    {
        throw new InvalidOperationException("未能獲取Aes算法實例");
    }
    //設置模式為CBC
    aes.Mode = CipherMode.CBC;
    //設置Key大小
    aes.KeySize = 128;
    //設置填充
    aes.Padding = PaddingMode.PKCS7;
    aes.Key = key;
    aes.IV = iv;

    //創建解密器
    var de = aes.CreateDecryptor();
    //解密數據
    var decodeByteData = de.TransformFinalBlock(encryptData, 0, encryptData.Length);
    //轉換為字符串
    var data = Encoding.UTF8.GetString(decodeByteData);

    return data;
}

需要注意的點:

1.SessionKey是小程序登錄過程中,調用 auth.code2Session 接口返回的。

2.加密數據和iv向量是微信一起返回的

3.這三個值必須匹配,一個不對都會造成解密失敗


免責聲明!

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



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