微信小程序ASE加密和C#后端

微信小程序引入

1、util中加入crypto-js.js文件

 

 2、在需要加密的js代码中引入

var CryptoJS = require("../../utils/crypto-js")

微信小程序前端加密

 function generateToken(length) {
      const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
      let token = '';
      for (let i = 0; i < length; i++) {
        const randomIndex = Math.floor(Math.random() * characters.length);
        token += characters.charAt(randomIndex);
      }
      return token;
    }
    const token = generateToken(16); // 生成长度为 16 的随机 token
    const key = CryptoJS.enc.Utf8.parse(token);//十六位十六进制数作为密钥
    const iv = CryptoJS.enc.Utf8.parse(token);//十六位十六进制数作为密钥
    //对账号密码进行加密
    var encryptedAccount = CryptoJS.AES.encrypt(account, key, { iv: iv }).toString();
    var encryptedPassword = CryptoJS.AES.encrypt(password, key, { iv: iv }).toString();
    // 传递账号密码和token即key 和 iv
 wx.request({
      url: '',
      data: { "ServiceName": "login", "encryptedAccount": encryptedAccount, "encryptedPassword": encryptedPassword, "token": token },
      method: 'POST',
      header: {
        'content-type': 'application/json' // 设置请求头部信息
      },
      success: function (res) {
        console.log(res.data); // 请求成功后的回调函数,res.data为响应数据
        if (res.data.StatusCode == 0) {
          wx.setStorageSync('account', account)
          wx.setStorageSync('LoginID', res.data.Data)
          wx.switchTab({
            url: '../index/index',
          })
        } else {
          wx.showToast({
            title: '用户名或密码错误',
            icon: 'none', // success / loading / none
            duration: 2000, // 提示框持续时间(毫秒),设置为 0 则不自动消失
            mask: false // 是否显示透明蒙层,防止触摸穿透,默认为 false
          })
        }
      },
      fail: function (res) {
        console.error(res); // 请求失败后的回调函数,打印错误信息
      }
    })

C#后端接收数据并解密

        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="context"></param>
        /// <param name="jBody"></param>
        /// <returns></returns>
        private string Login(HttpContext context, JObject jBody)
        {
            string encryptedAccount = $"{jBody.GetValue("encryptedAccount")}";
            string encryptedPassword = $"{jBody.GetValue("encryptedPassword")}";
            string token = $"{jBody.GetValue("token")}";
            string key = token;
            string iv = token;
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] ivBytes = Encoding.UTF8.GetBytes(iv);
            string decryptedAccount = Decrypt(encryptedAccount, key, iv);
            string decryptedPassword = Decrypt(encryptedPassword, key, iv);
            UserInfo userinfo = UserInfo.Login(decryptedAccount, decryptedPassword);
            if (userinfo == null)
                return ResponseResult(context, SysUtils.BuildJsonResult_J(-1, "错误的账号或密码", ""));
            return ResponseResult(context, SysUtils.BuildJsonResult_J(0, "登录成功", ""));
        }

        /// <summary>
        /// ASE解密函数
        /// </summary>
        /// <param name="encryptedText"></param>
        /// <param name="key"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        private static string Decrypt(string encryptedText, string key, string iv)
        {
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] ivBytes = Encoding.UTF8.GetBytes(iv);
            byte[] encryptedBytes = Convert.FromBase64String(encryptedText);

            using (AesManaged aes = new AesManaged())
            {
                aes.Key = keyBytes;
                aes.IV = ivBytes;
                aes.Mode = CipherMode.CBC; // 在实际使用中,请选择合适的模式和填充方式
                aes.Padding = PaddingMode.PKCS7;

                ICryptoTransform decryptor = aes.CreateDecryptor();
                byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);

                return Encoding.UTF8.GetString(decryptedBytes);
            }
        }

注意

key 和 iv 生成时一定要是16位否则后端无法解密,会跳出程序执行流。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值