文章

密码如何安全传输?从哈希到挑战-响应机制

密码安全传输通常依赖 TLS 加密或挑战-响应机制,防止被监听或重放,服务器端则存储加盐哈希防泄露。

密码如何安全传输?从哈希到挑战-响应机制

密码如何安全传输?从哈希到挑战-响应机制

密码的直接传输风险

如果客户端直接把密码明文发给服务器,网络中可能被监听(中间人攻击、抓包等),导致密码泄露。

直接传输密码的 hash(简单版,不安全)

有些系统会让客户端先对密码做哈希(比如 MD5、SHA256)后再发给服务器,避免明文密码传输。

缺点:

  • 这种方式仍然有风险,因为黑客截获了 hash 值后,就可以直接用这个 hash 值当“密码”去登录(称为重放攻击)。
  • 传输的是密码的“hash”,这个 hash 本身就成了密码,不能防止中间人重放。

服务器端保存密码的 hash(安全的做法)

服务器不存明文密码,而是存密码的哈希值(通常还加盐 salt),这样即使数据库泄露,也不会直接暴露密码。

  • 用户登录时,服务器拿到密码明文(通过安全通道传输),在服务器端做 hash 和盐处理,和数据库存的 hash 比较。
  • 传输过程依赖安全通道(如 HTTPS),保证密码明文不被监听。

安全传输密码的标准方案 — 使用加密协议(例如 TLS/HTTPS)

  • 客户端直接发送明文密码(用户输入的),但整个传输链路被 TLS 加密,外界无法监听。
  • 服务器收到密码后在本地做 hash 和盐处理。

进阶安全方案 — 使用挑战-响应机制(Challenge-Response)

比如:

  • 服务器发送一个随机“nonce”(一次性随机数)给客户端。
  • 客户端用密码和这个 nonce 生成一个 hash(比如 hash(password + nonce)),再发送给服务器。
  • 服务器也用存储的密码 hash 和相同的 nonce 计算 hash,比较是否相等。
  • 这样避免了密码或密码 hash 在网络上被重放。

如果黑客截获了 nonce 和 H 会发生什么?

黑客拿到的是:

  • nonce
  • H = hash(password + nonce)

黑客能否从 Hnonce 反推出密码?一般情况下,答案是:不能直接反推出密码。因为哈希函数(比如 SHA256)是单向函数:能轻松算出 hash(x),但不能反推 x。也就是说,黑客只拿到 Hnonce,无法通过逆向哈希函数直接恢复密码。

但现实中有潜在风险,如果密码弱(比如简单密码、常用密码),黑客可以用字典攻击暴力破解,因此,密码复杂度和随机性非常重要。

典型流程总结

方案传输内容安全点 / 风险
明文传输 + HTTP明文密码非常不安全,容易被监听
客户端 hash 密码传输hash 值易被重放攻击,hash成密码
TLS/HTTPS + 明文传输明文密码,但加密传输目前主流方案,安全性高
挑战-响应认证计算的hash值防重放攻击,但实现复杂
服务器存储 hash + 盐服务器存储安全防数据库泄露泄漏密码
本文由作者按照 CC BY 4.0 进行授权