前端实现 MD5 + AES 加密的安全登录请求

在实际开发中,直接将用户的明文密码传输到后端存在较大安全风险。为了提高安全性,常见的做法是在前端发送前先对密码进行 MD5 哈希 ,再用 AES 对称加密 进行二次加密,然后使用 application/x-www-form-urlencoded 格式发送给后端。本文将介绍如何在 Vue 项目中实现这一登录流程。


一、需求背景

后端要求登录接口接收三个字段:

  • account:用户名

  • password:先 MD5 再 AES 加密的密码

  • grant_type:固定值 'password'

接口需要使用 POST 方法,且 Content-Type 必须为 application/x-www-form-urlencoded


二、依赖安装

我们需要三个依赖库:

复制代码
npm install qs js-md5 crypto-js
  • qs :将对象序列化为 key=value&key=value 格式

  • js-md5:实现 MD5 哈希算法

  • crypto-js:实现 AES 对称加密


三、AES 加密工具封装

创建 src/utils/encrypt.js

复制代码
import CryptoJS from 'crypto-js'

// 注意:key 和 iv 必须与后端保持一致
const key = CryptoJS.enc.Utf8.parse('1234567890abcdef') // 16 字节密钥
const iv = CryptoJS.enc.Utf8.parse('abcdef1234567890') // 16 字节向量

export const aesEncryption = {
  encrypt(word) {
    const srcs = CryptoJS.enc.Utf8.parse(word)
    const encrypted = CryptoJS.AES.encrypt(srcs, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    })
    return encrypted.toString()
  },
  decrypt(ciphertext) {
    const decrypted = CryptoJS.AES.decrypt(ciphertext, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    })
    return decrypted.toString(CryptoJS.enc.Utf8)
  }
}

安全提示 :生产环境中 keyiv 不建议直接写死在前端,可通过后端下发、动态生成等方式提高安全性。


四、改造登录接口

src/api/auth.js

复制代码
import qs from 'qs'
import request from '@/utils/request'
import { httpUri } from '@/config'

// 登录接口
export function login(data) {
  return request({
    url: `${httpUri}/api/oauth/Login`,
    method: 'post',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    data: qs.stringify(data) // 转为 x-www-form-urlencoded 格式
  })
}

五、调用示例

复制代码
import md5 from 'js-md5'
import { aesEncryption } from '@/utils/encrypt'
import { login } from '@/api/auth'
import { ElMessage } from 'element-plus'

// 假设这是 Vue3 中的表单
const form = ref({
  user: '',
  password: ''
})

async function handleLogin() {
  if (!form.value.user || !form.value.password) {
    ElMessage.warning('请输入账号和密码')
    return
  }

  try {
    // 1. MD5 加密
    const md5Pwd = md5(form.value.password)

    // 2. AES 再加密
    const encryptedPwd = aesEncryption.encrypt(md5Pwd)

    // 3. 构造请求参数
    const payload = {
      account: form.value.user,
      password: encryptedPwd,
      grant_type: 'password'
    }

    // 4. 调用登录接口
    const res = await login(payload)

    // 5. 登录成功处理
    console.log('登录成功', res.data)
    ElMessage.success('登录成功')
  } catch (err) {
    console.error('登录失败', err)
    ElMessage.error(err?.response?.data?.message || '登录失败')
  }
}

六、执行流程图

复制代码
用户输入密码
     ↓
 MD5 哈希
     ↓
AES 加密 (key + iv)
     ↓
x-www-form-urlencoded 序列化
     ↓
POST 请求发送到后端

七、总结

通过 MD5 + AES 双重加密 ,我们在一定程度上减少了密码在传输过程中的风险;配合 application/x-www-form-urlencoded 提交格式,可以更好地适配一些后端框架的解析方式。

完整实现中需要注意:

  1. keyiv 必须与后端保持一致。

  2. 加密并不能完全防止泄露,HTTPS 仍然是必不可少的传输加密手段。

  3. 如果想进一步简化调用,可以将加密逻辑放到 login 方法内部或请求拦截器中,调用时只传明文密码。

相关推荐
_阿南_4 小时前
项目中新增给AI制定的代码规范
前端·程序员
名字还没想好☜5 小时前
React 实现暗黑模式切换:localStorage 持久化、SSR 首屏闪烁与跟随系统主题
前端·javascript·react.js·ecmascript·react·next.js
console.log('npc')6 小时前
Git 冲突与 AI 协助指南
前端·人工智能·git·大模型
腾视科技-AI6 小时前
腾视科技AIBOX双版本重磅发布!本地安全与全球适配,解锁视频智能新可能
大数据·人工智能·科技·安全·大模型·腾视科技·ai算力盒
迪康coolmu7 小时前
企业文档安全防护体系拆解:从备份、防勒索到全链路水印管控
安全
爱学堂IT分享7 小时前
Cesium可视化系统实战课程-Cesium教程学习
前端
糖墨夕8 小时前
理解大语言模型:Agent 的“大脑”
前端·agent
Rain的Java大神之路8 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
cpolar技术支持8 小时前
浏览器也能跑本地 AI:用 Transformers.js + WebGPU 做一个最小推理 Demo,cpolar 给同事远程体验
前端·ai·cpolar·webgpu·transformers.js
计算机魔术师10 小时前
OpenAI 发布 GPT-6 Astra:多项基准刷新纪录, cybersecurity 能力达 Critical 阈值
前端