• .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.这三个值必须匹配,一个不对都会造成解密失败

  • 相关阅读:
    59
    58
    57
    56
    55
    54
    53
    转 Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5
    jquery用正则表达式验证密码强度
    什么是高内聚、低耦合?(转载)
  • 原文地址:https://www.cnblogs.com/stulzq/p/13568377.html
Copyright © 2020-2023  润新知