前端请求怎么加密才安全?

FSD-峻豪 阅读 50

我在做登录功能,想把用户密码加密后再发给后端,但不知道该在前端怎么处理。试过用 crypto-js 的 AES 加密,但每次加密结果都不一样,后端解不出来。

这是我的 Vue 代码,是不是哪里写错了?

<script setup>
import CryptoJS from 'crypto-js'

const login = () => {
  const password = '123456'
  const key = CryptoJS.enc.Utf8.parse('my-secret-key-123')
  const encrypted = CryptoJS.AES.encrypt(password, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  }).toString()
  console.log(encrypted) // 每次刷新页面结果都不同!
}
</script>
我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
a'ゞ怡瑶
你这个问题我遇到过,是ECB模式的问题。ECB每次加密结果不一样是因为缺少iv参数,不过前端这块其实不应该用对称加密来搞密码传输,HTTPS已经够安全了。

不过既然你问了,先解决代码问题。改用CBC模式并固定iv就能解决:

const login = () => {
const password = '123456'
const key = CryptoJS.enc.Utf8.parse('my-secret-key-123')
const iv = CryptoJS.enc.Utf8.parse('1234567812345678') // 固定16位iv
const encrypted = CryptoJS.AES.encrypt(password, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString()
}


但说真的,前端加密密码这事儿没太大必要。正确做法应该是:
1. 用HTTPS保证传输安全
2. 后端对密码做加盐哈希存储
3. 真要前端加密的话用非对称加密(比如RSA),把公钥放前端

你这方案就算能用,密钥在前端也是裸奔,有心人看下源码就能拿到密钥,安全性其实没提升。
点赞
2026-03-07 10:09
诸葛芳芳
你这个问题是用了ECB模式导致每次加密结果不一样,换成CBC模式并固定iv就行了。改这样:

const iv = CryptoJS.enc.Utf8.parse('1234567890123456')
const encrypted = CryptoJS.AES.encrypt(password, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString()


不过说真的,前端加密卵用不大,该用https的地方别省。
点赞 1
2026-03-06 06:01