登录
前端
方案一:HTTPS + “明文”传输
前端不加密,依赖HTTPS传输
- 现代Web安全最佳实践
- HTTPS已经提供传输层加密
- 避免前端哈希引入的安全复杂性
- 允许服务器使用标准的密码哈希策略(如bcrypt)
前端哈希反而可能降低安全性
- 破坏标准安全模型:将密码哈希当作"密码"使用,违反了哈希算法的设计初衷, bcrypt设计目的是存储保护而非传输保护
- 无法利用服务端安全增强
- 引入新的攻击面: 现在hashed成为事实上的"密码",如果数据库泄露,攻击者可以直接使用这些哈希值登录
- 无法防止重放攻击
方案二:HTTPS + 非对称加密(更安全但复杂)
js
// 前端使用后端提供的公钥加密密码(如 RSA-OAEP)
async function encryptPassword(password, publicKey) {
const encoder = new TextEncoder();
const encodedPassword = encoder.encode(password);
const encrypted = await window.crypto.subtle.encrypt(
{ name: "RSA-OAEP" },
publicKey,
encodedPassword
);
return btoa(String.fromCharCode(...new Uint8Array(encrypted)));
}
// 后端需提前提供公钥(可通过接口获取)- 优点:密码在传输前加密,后端用私钥解密,全程无明文。
- 缺点:实现复杂,需管理密钥对。
HTTPS + SRP(安全远程密码协议)
是一种零知识密码证明(Zero-Knowledge Password Proof, ZKPP) 认证协议,允许客户端在不传输密码的情况下向服务器证明自己知道密码。它结合了密码学哈希、密钥交换(DH)和盐值保护,被广泛用于高安全场景(如银行、企业VPN)。
后端密码验证流程
- 接收并解密/哈希处理
- 如果前端加密:先用私钥解密,再哈希比对。
- 数据库密码比对(关键步骤)
- 防止时序攻击(Timing Attack):固定时间比对:无论用户是否存在,密码是否正确,响应时间应一致。
时序攻击:通过分析程序执行时间的差异来推断敏感信息(如密码、密钥等错误时,执行时间随正确前缀长度变化)。 固定时间比对算法 哈希化比对,先对输入做哈希再比对 最佳实践:所有安全敏感的比较操作(密码、Token、密钥等)必须使用恒定时间函数。
何时选择哪种方案?
- 大多数场景:方案一足够安全且简单。
- 金融/政府系统:结合方案二(非对称加密) + SRP。