知识卡片

客户端加密对防泄密无意义但对防服务端滥用密码仍有价值

普通读书笔记卡

内容

“要不要在客户端就对密码加密”是个常被误解的问题,答案取决于问的是哪个 目标。如果目标是防止传输过程被黑客窃听,客户端加密没有意义——网络通信 不是点对点的,客户端根本无法控制信息会经过哪些节点(代理、路由器、DNS 服务都可能被中间人攻击劫持并篡改),在传输链路本来就不可信这个前提下, 客户端做的任何加密防护都只是马其诺防线,唯一真正有效的手段是启用HTTPS。 但如果目标是防止密码在服务端被滥用(大网站被拖库、密码明文写入数据库或 被输出到日志的事故屡见不鲜),客户端加密就有实际价值——只要密码从客户端 出发时就已经是不可逆的哈希值而非明文,服务端从一开始就不会接触到真正的 明文密码,也就消灭了”明文密码泄漏”这个最烫手的风险源。有人主张服务端 保留明文密码是为了方便动态加盐比对,但这个便利不值得付出的代价:客户端 是否动态加盐都不可能替代HTTPS的防护效果,真正应该在服务端做的防御是 密码存储环节的加密,用来降低服务端被攻破后批量泄漏密码的风险,而不是 指望它能加强传输安全。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第5章"架构安全性" 5.4.2节"客户端加密"(源文件:_epub-src对应OEBPS/Text/chapter68.xhtml) - 结论依据:原文说明网络通信非点对点、客户端无法控制传输路径,因此客户端 加密对防窃听无意义,但为了避免明文密码在服务端被拖库、写入日志等场景 滥用,客户端从一开始就加密仍有价值,直接支撑本卡片结论。 - 原始内容:为了保证信息不被黑客窃取而做客户端加密没有太大意义,对绝大 多数的信息系统来说,启用HTTPS可以说是唯一的实际可行的方案。但是,为了 保证密码不在服务端被滥用,在客户端就开始加密还是很有意义的。