专栏首页晓晨的专栏.NET Core 对接微信小程序数据解密

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .NET Core 使用HMAC算法

    通过哈希算法,我们可以验证一段数据是否有效,方法就是对比该数据的哈希值,例如,判断用户口令是否正确,我们用保存在数据库中的password_md5对比计算md5...

    晓晨
  • Autofac高级用法之动态代理

    晓晨
  • Gogs搭建教程-极易搭建的自助 Git 服务

    晓晨
  • LeetCode 931. 下降路径最小和(DP)

    下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。

    Michael阿明
  • c++中stack、queue、vector的用法一、栈(stack)二、队列(queue)三、向量(vector)

    一、栈(stack) 引入头文件 #include<stack> 常用的方法 empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增...

    致Great
  • 建议收藏 哭着喊着 从C语言转向C++刷算法

    称为栈(或者堆栈),堆栈是一个不容忽视的概念。堆栈都是一种数据项按序排列的数据结构,只能在一端( 称为栈顶(top) )对数据项进行插入和删除.

    韩旭051
  • Android Studio 3.6安装全过程及AVD安装运行步骤详解

    (2)开始安装Android Studio集成开发环境,安装允许以管理员模式运行,如图1.2所示

    砸漏
  • 在Docker的工作流中常见问题及最终方案

    现在除了容器内容封装的一些依赖关系,我们就拥有了一个相对正常的开发环境了。然而这里还有一个问题,那就是我们不能在生产环境使用这个容器,因为它正在运行的是默认的F...

    Java帮帮
  • C++初入门,写个弱智银行卡系统

    写在前面: 自从课程设计之后,我们就开始了生产实习,我们老师找的是河南卫华集团的技术部实习,经过一阵子的不适应(比如说河南这边的基本没味道的伙食,我们现在两个人...

    用户1687088
  • 基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现

    我在之前的文章《基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现》中,根据《Coordinates for Instant ...

    charlee44

扫码关注云+社区

领取腾讯云代金券