Skip to content

登录

前端

方案一: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)。

后端密码验证流程

  1. 接收并解密/哈希处理
  • 如果前端加密:先用私钥解密,再哈希比对。
  1. 数据库密码比对(关键步骤)
  2. 防止时序攻击(Timing Attack):固定时间比对:无论用户是否存在,密码是否正确,响应时间应一致。

时序攻击:通过分析程序执行时间的差异来推断敏感信息(如密码、密钥等错误时,执行时间随正确前缀长度变化)。 固定时间比对算法 哈希化比对,先对输入做哈希再比对 最佳实践:所有安全敏感的比较操作(密码、Token、密钥等)必须使用恒定时间函数。

何时选择哪种方案?

  • 大多数场景:方案一足够安全且简单。
  • 金融/政府系统:结合方案二(非对称加密) + SRP。