一般的中小系统,直接使用用 HTTPS + 前端不加密,后端用 Argon2 存储就已经够用了。但是要做一个高安全的场景中(金融等于小钱钱挂钩的),“纵深防御 + 零信任” 架构下的加密模式。
HTTPS + 前端 RSA-OAEP 加密 + 动态公钥 + 一次性 Token,这个大致流程如下:
sequenceDiagram
participant User as 用户
participant Frontend as 前端
participant Backend as 后端
Backend->>Frontend: (1) 返回 loginToken + RSA/ECC 公钥(HTTPS)
User->>Frontend: (2) 输入密码
Frontend->>Frontend: (3) 用 RSA/ECC加密(loginToken+密码+时间戳) → C
Frontend->>Backend: (4) POST { C }
Backend->>Backend: (5) 用 RSA/ECC 私钥解密 C → 得密码等信息
Backend->>Backend: (6) 验证 loginToken和时间戳 有效性
Backend->>Backend: (7) 用 Argon2 验证密码
一、HTTPS 的局限性(你以为的安全 ≠ 实际安全)
✅ HTTPS 能防什么?
- 中间人窃听(如公共 Wi-Fi)
- 数据篡改
- 服务器身份伪造(通过 CA 证书)
❌ HTTPS 不能防什么?
| 威胁 | 说明 |
|---|---|
| 终端被监控 | 用户安装了公司 IT 监控软件(如 Zscaler、Forcepoint),可解密所有 HTTPS 流量(通过企业根证书) |
| 浏览器插件窃取 | 恶意 Chrome 插件可读取 fetch() 的明文密码 |
| XSS 攻击 | 若网站存在 XSS 漏洞,攻击者可直接获取 `` 中的原始密码 |
| 内存转储 | 恶意软件可扫描浏览器进程内存,提取明文密码 |
| 开发者工具泄露 | 用户误操作在 Console 打印密码(虽少见,但金融系统需考虑) |
💡 HTTPS 的信任边界止于“浏览器进程,而前端加密把信任边界延伸到“用户输入那一刻。
🛡 二、前端加密如何补足这些缺口?
| 组件 | 解决的问题 |
|---|---|
| RSA-OAEP 加密 | 即使 HTTPS 被解密(如企业代理),攻击者拿到的也只是无法解密的密文(私钥在服务端 HSM 中) |
| 动态公钥 | 防止公钥硬编码被替换;每次登录用新密钥对,实现前向保密 |
| 一次性 Token | 防重放攻击(Replay Attack)——即使密文被截获,也无法复用 |
| 前端执行加密 | 密码在离开 DOM 前就已加密,XSS/插件只能拿到密文,无法还原明文 |
✅ 效果:即使攻击者控制了用户的整个网络环境(包括 HTTPS 解密能力),也无法获取原始密码。
评论区