微信小程序引入
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位否则后端无法解密,会跳出程序执行流。