Asp.Net Core解密微信小程序的敏感数据(以获取手机号为例)

作者 the7
发布于 2020年01月18日
评论 0
浏览 269

微信小程序里的敏感数据,小程序并不明文提供,如wx.getUserInfo里的openIdunionId,还有比如获取手机号的getPhoneNumber,小程序端得到的是加密数据,还需要再服务器再次解密,微信官方提供了pythonphpnodec++四种示例代码,缺少.net的,憾!本文以获取手机号为例,演示如何获取明文手机号。

第一步:获取session_key

关于如何获取 session_key ,可查看另一篇文章 Asp.Net Core如何获取微信小程序openid以及session_key

第二步:小程序端

页面上放一个按钮

 <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>

对应js文件

getPhoneNumber:function(e){
    //发送加密数据到服务端
    app.api.userModifyMobile(e.detail.encryptedData, e.detail.iv).then(res => {
    });
}

第三步: 服务端解密

解密算法

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData)
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  4. 对称解密算法初始向量 为 Base64_Decode(iv),其中iv由数据接口返回。

C#代码

var rijndael = new RijndaelManaged
{
    BlockSize = 128, 
    Mode = CipherMode.CBC, 
    Padding = PaddingMode.PKCS7
}; 

var encryptedData = Convert.FromBase64String(request.encryptedData);
var key = Convert.FromBase64String(session_key);//第一步获取到的session_key
var iv = Convert.FromBase64String(request.iv);
            
var decryptor = rijndael.CreateDecryptor(key, iv);
using (var msDecrypt = new MemoryStream(encryptedData))
{
    using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
    {
        using (var srDecrypt = new StreamReader(csDecrypt))
        {
             var plaintext = srDecrypt.ReadToEnd();
             var json = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(plaintext);
             var phoneNumber = json.phoneNumber;
             var purePhoneNumber = json.purePhoneNumber;
             //至此,成功获取到手机号
         }
    }
}

0条评论

请先登录后发表评论
提交评论
标签云
css (1) less calc (1) C# (4) C#进制转换 (1) asp.net core (8) Authentication (1) 注销 (1) 登录 (1) 验证 (1) scroll-view (1) 微信小程序 (4) 滚动到底部 (1) StackExchange.Redis (1) google (1) 百度 (1) nginx (2) 大文件 (2) 微信小程序c#解密 (1) 微信小程序获取手机号 (1) openid (1) session_key (1) CDN (1) URL鉴权 (1) 阿里云 (1) async (1) await (1) 禁止下拉上滑效果 (1) Index类型 (1) Range类型 (1) dontent publish (1) dotnet publish在线生成器 (1) System.DrawingCore.GDIPlus报错 (1) centos (1) 中文字体 (1) SqlBulkCopy (1) SqlSugar (1) JWT (5) 认证 (3) RSA JWT (1) 非对称加密 (1) 写信 (1) 见字如面 (1) 优化建议 (2) 正确操作字符串 (1) Java (1) JWT退出 (1) RefreshToken (1) .NET Core网站开发框架 (1) Moz (3) 墨子 (1) JSON.NET (1) Newtonsoft (1) System.Text.Json (1) 自定义后台路径 (1) .netcore (1) quartz (2) 作业调度框架 (1) 作业调度 (1) 定时任务 (1) exception (1) 异常处理 (1) HttpClient (1) IHttpClientFactory (1) RDM (1) Redis (1) Redis Desktop Manager (1) RedisDesktopManager (1) linux (1) mac (1) windows (1) Could not get any response (1) postman (1) leetcode (2) 力扣 (1) 回文字符串 (1) 面试刷题 (1) centos7 (1) php安装 (1) 网易云插件 (1) 马甲App (1) Discuz插件 (1) 网易云音乐 (1) Blazor (1) 五子棋 (1) c#解题 (1) 最长连续序列 (1) Swagger (1) 在线文档 (1) blob (1) mp4 (1) 视频 (1) big file (1) 上传 (1) s (1) Azure (1) Azure Key Vault (1) Configuration (1) 密钥保管库 (1) Dapper安装 (1) Dapper是什么 (1) Dapper连接Mysql (1) Dapper连接SqlServer (1) dapper (1)