为什么 SCRAM 协议没有更广泛地应用于网站登录验证

2024-05-24 08:31:41 +08:00
 henix

看了最近关于是否应该在 https 协议中明文传输密码想到的

之前部署 MongoDB 的时候,了解到 SCRAM 这个协议:

https://www.mongodb.com/docs/manual/core/security-scram/ https://en.wikipedia.org/wiki/Salted_Challenge_Response_Authentication_Mechanism

关于网站的登陆验证,网友们基本上分为两派:

  1. 用了 https 就可以在里面传明文
  2. 不信任 https ,还要搞一套自己的加密 or hash

其实我个人更倾向于 1 的,但也有一点担心:明文密码可能会被 CDN 服务商看到。这个问题对于能自建 CDN 的大厂来说无所谓,但个人小网站就要考虑该不该信任 cf 或 aws 的问题了。

对于 2 ,其实相当于要在一个不安全的信道上进行登录验证。即用户知道密码,而服务器知道怎么验证密码。这个问题,业界已经有比较成熟的方案,也就是 MongoDB 使用的 RFC5802 SCRAM 协议。据说在 PostgreSQL 、Kafka 和 XMPP 中也使用了这一机制。

https://zhuanlan.zhihu.com/p/650862248

简单地说,在这个协议中,客户端并不是直接传输 hash(密码) ,而是需要跟服务端进行多轮 Challenge-Response 。因为 hash(密码) 是固定的,如果直接传输,黑客也可以拿这个东西直接登录。客户端发送的 challenge 和服务端回应的 response 中都带有随机 nonce ,也就避免了重放攻击。

之前的帖子里也有人问“前端加密或者哈希”的完整方案是什么,这个 SCRAM 协议就是一个完整方案。

所以我挺好奇为啥在网站登录领域没看到有人提 SCRAM ,明明在数据库领域已经有广泛应用。

2164 次点击
所在节点    程序员
13 条回复
macaodoll
2024-05-24 08:40:52 +08:00
HTTPS 只能保证传输过程的安全,但是对于爬虫来说,请求体没有加密签名之类的东西,就等于脱光了
protonme
2024-05-24 08:42:40 +08:00
moyuge
2024-05-24 08:58:25 +08:00
个人觉得使用 RSA 加密足够了,不论是 http 还是 https 场景,前端通过接口获取公钥,公钥加密私钥解密,定期更换密钥对即可。
cybort
2024-05-24 09:09:30 +08:00
每次选择不同的盐值确实是一个思路,不过没看明白在服务器没有存原文的情况下怎么实现的
codehz
2024-05-24 09:13:57 +08:00
防 cdn 作恶这方面没有任何技术可以解决
因为 cdn 理论上可以直接修改网页内容加上键盘记录器()
毕竟你加密和验证的代码也是通过 cdn 传输的()
某种意义上要想不要泄露密码只能通过无密码方案,例如 passkey ,但即便如此,也无法阻止 cdn 进行会话劫持。
lisxour
2024-05-24 09:28:50 +08:00
@moyuge 百度贴吧就是这么干的,防止了大部分的常规攻击场景
abelyao
2024-05-24 10:04:40 +08:00
@codehz 不需要上键盘记录器,只要在 onClick 之后、hash 之前,加一行代码就可以把明文密码拿走了
penzi
2024-05-24 10:20:03 +08:00
算法太难了,99%的开发者大脑理解不了。

就像 V2EX 居然还有这么多人理解不了为什么不明文传输密码。以为是不信任 https 的安全性
adoal
2024-05-24 10:39:16 +08:00
要几轮 C-R ,这个就复杂了,尤其是用在 HTTP 这种传统上收发是有序的两阶段、收发完一轮就断开的 stateless protocol 时,不像长连接交错收发的协议上实现起来简单。
cheng6563
2024-05-24 10:57:21 +08:00
因为 Web 有 tls+CA 证书链这种更有效的东西...

无预制 CA 的场景,除非直接拿客户密码当秘钥,其他方案本质上是混淆而非加密
nook4sh
2024-05-24 11:44:40 +08:00
SCRAM 和所谓的前端加密有一丁点关系吗?
coolcoffee
2024-05-24 13:13:25 +08:00
SCRAM 适合后端服务、App 之间进行通信沟通,但不适合 web 前端这种使用下发脚本来执行的环境。

假如 cf 和 aws 这类 cdn 大厂需要做恶,它可以选择注入脚本监听用户输入框。整个运行环境都不可信任了,谈加密有意义吗?
JKeita
2024-05-24 14:34:48 +08:00
SCRAM 和 https 没毛关系吧,应用场景都不一样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1043429

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX