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

初次遇到須要數據解密的地方是在「獲取手機號」,前端組件調用後得到的是加密數據,須要發送到服務端進行解密。html

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

  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 接口返回的。api

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

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

相關文章
相關標籤/搜索