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

  • 相关阅读:
    [leetcode-135-Candy]
    [leetcode-151-Reverse Words in a String]
    [leetcode-139-Word Break]
    [leetcode-129-Sum Root to Leaf Numbers]
    [leetcode-143-Reorder List]
    [leetcode-141-Linked List Cycle]
    oracle 环境变量(中文显示乱码)
    Oracle 自增长id
    Spring.net 事件的注入
    Spirng.net 替换任意方法
  • 原文地址:https://www.cnblogs.com/stulzq/p/13568377.html
Copyright © 2011-2022 走看看