启用了 https 的网站登录时密码加密有意义吗?

2022-05-23 16:51:49 +08:00
 kabob

今天登录某些网站时发现对密码进行了加密传输,这样做是防止哪些漏洞?

7997 次点击
所在节点    SSL
97 条回复
lakehylia
2022-05-24 15:37:16 +08:00
说一句,国内现在密码登录等同虚设了,手机验证码代替了密码。。。
vishun
2022-05-24 15:37:52 +08:00
@GuuJiang #25 正常来说前端加密压根不用 hash ,而是类似用 rsa 加密,前端密码加密后,后端根据解密出明文密码,然后再用后台的 hash 来匹配数据库,压根说的不是一个东西。
0zero0
2022-05-24 16:04:36 +08:00
通过这个帖子感受到了技术辩论的好处和意义……感谢
yEhwG10ZJa83067x
2022-05-24 16:06:45 +08:00
@wizzer #13 我靠,我也想说这个
keyfunc
2022-05-24 17:17:58 +08:00
@Buges 其实还是成本问题,一家 CA 从提交预埋申请到完成预埋周期是很长的,Mozilla 起码需要 2 年,微软、Google 、Apple 这些商业机构的预埋前置条件是完成 Mozilla 的流程,别说还有 oracle 、黑莓这些联系都很难的机构。WebTrust 每年的审计费用和 PKI 基础设施的相关费用也是非常高的。就算你完成了所有预埋,但要保证预埋的根证书有良好的兼容性,需要一个非常久的沉默期,这个期限可能是 3-4 年。CA 确实有能力实施中间人攻击,但这么做的代价就是别做这块业务了,CA 与浏览器之间有公益性的交流机构 CABFourm ,所有的证书规则基本由这家机构制定的,目前对 CA 的主观恶意行为是 0 容忍的。
zpf124
2022-05-24 17:29:07 +08:00
@Buges 我承认你说的这个问题,但我个人还是认为 https 不太容易被攻击,前端 hash 的缺点高于优点。
同时我说了我觉得前端要做可以做非对称加密
findex
2022-05-24 17:59:56 +08:00
脱裤的时候让对方费电事
Buges
2022-05-24 19:05:18 +08:00
@zpf124 前端 hash 和后端 hash 是互不影响、完全无关且相互独立的两件事。前者是为了避免撞库和保持 zero knowledge ,无论后端是否 hash 。后者是为了避免脱裤后登录,无论前端是否 hash 。
至于公钥加密同上,后端依旧能得到用户的明文密码。
前端 hash 唯一的缺点就是倒闭了之后不能卖用户的秘密库。
liuhan907
2022-05-24 20:06:04 +08:00
@Buges 前端 hash 还有一个缺点是后端无法检查密码强弱和是否已经泄露。
wonderfulcxm
2022-05-24 20:21:31 +08:00
前端 hash 纯属脱裤子放屁,我没见哪个知名大厂这么用的。
tool2d
2022-05-24 20:33:05 +08:00
一般情况下加密意义不大,但是如果遇到真心想破解你网站 API 的黑客,那就另当别论了。
Buges
2022-05-24 20:36:21 +08:00
@liuhan907 前端可以自己检查强弱,至于泄露更不用发送明文。
GeruzoniAnsasu
2022-05-24 21:31:18 +08:00
@Buges 如果把「认证要素」(无论是 plain password 还是 access token )视为 knowledge ,后端是无论如何必须知情的。后端不可能在不接触 auth chellenge 的情况下给出判定,因此「认证要素」是必须放在客户端信道中传输的。

换句话说,假如信道不安全,无论密码有无实现 hash ,中间人总是能复制出一个后端无法分辨的 chellenge 。chellenge 内容是 plain text 还是 hash 根本不重要,中间人能完整复制且通过后端验证。这是信道安全的必要性。

然后再讲充分性,即是否「只要信道安全则认证安全」;可以用其逆否来判断,即是否「认证不安全一定说明是信道不安全」。我们会发现存在比如「用户泄露自己的凭证」这种条件,所以仅当「泄露凭证」等条件不成立时才可以认为信道安全是认证安全的充分条件。(我暂时没想到其它条件,因此所有下文提到的「凭证泄露」条件都是此处反例条件的 并集,这个并集暂时只有一个元素。)


因此引理 1: auth 的安全性取决于信道安全,当且仅当凭证未泄露


第二步,我们讨论这个系统在任意情况下是否会导致凭证泄露。很容易会发现假若凭证存储等于凭证原文时凭证有可能泄露,而当凭证存储不完全独立于其它关联信息时(比如用户个人信息),也有导致泄露的可能性,其余情况不可能泄露。

因此引理 2: 当且仅当凭证存储的内容完全独立于关联性数据,且无法根据存储还原出凭证原文时,「凭证泄露」不可能发生


看这两个引理:
1. 当凭证不泄露时信道安全是认证安全的充要条件
2. 当凭证存储于原文和相关信息都完全独立时凭证不可能泄露

我们可以得出结论: 只要传输的认证要素与用户相关信息完全独立且信道是安全的,那么认证就是安全的。
用密码的一大问题是它跟用户信息往往存在相关性,因此使用密码原文作为认证要素有泄露密码的风险。但注意这不是因为脱库能拖出密码,也不是因为密码被撞了。我们现在讨论的是单一系统的安全性。是在说如果库记录完全公开了,这个用户的密码是否有被还原的可能性。如果他的密码本身就非常随机,即使库被公开了,密码也是不可能泄露的(不考虑 hash 被爆破的可能性)。

再强调一下,至此为止我们只考虑单一系统的安全性,不考 hash 能从已知明文撞出来的情况。



然后第三步,我们才来考虑多个这样的系统同时存在的场景。很容易发现由于引理 2 ,只要两个系统存在同样的密文,那么这两个系统就有可能发生相互泄露,因为此时「另一个库的密文」就是「本库密文」的相关数据了。换言之如果一个库存储的凭证被泄露了,是有可能发生另一个库的凭证泄露,从而破坏另一个系统的认证安全的。不过在单系统场景的假设下,凭证是可以不存在泄露可能的,即使凭证可以从一个系统泄露到另一个系统,但第一个泄露本身不可能发生。


综上总结一下我在实行和可得出结论的:
1. 前端加密没有用,因为它不增加信道安全性。顶多增加凭证密文的独立性,但假如我密码足够随机,在可信信道中传递密码还是 hash 过的密码有什么所谓呢
2. 多系统共用密码且共用了 hash 方法的话很可能会发生撞库,但只要保证每个这种系统即使数据库公开也无法还原我的密码,那我大可以就只用一个密码,想撞库,没材料。


3. 所以我现在的密码是分级的
- 垃圾不信任级:我感觉这网站的密码没准是明文存的,那么避免使用密码,只使用 otp 如短信验证码这种认证方式。因为对于这些网站来说密码根本是冗余的、无效的认证信息。
- 可信级,我觉得这网站的密码存储机制是足够科学的,即使库爆了应该也不能还原出密码。这些网站我全都使用同样的随机密码,因为记随机密码的心智负担有点大,我只能记一两个
- 高安全等级,存了我大量个人信息和记录的,绝对要杜绝任何认证被攻破可能性的,比如 google qq 这种,每个网站使用完全不同的密码,我有一套生成规则

4. 我不使用密码管理器。因为无非是把撞库风险面从远程服务器转到了个人设备上。而个人设备很容易使人掉以轻心,比如相信不少人密码管理器的 pin 就不会很复杂了对吧

5. 开发要登录的业务系统,不进行任何传输层上的变形,比如什么前端 hash 这种,没用。when in need 套 TLS
sutra
2022-05-24 21:33:37 +08:00
说得好像不启用 http ,密码加密传输就有意义似的。
zpf124
2022-05-24 22:05:48 +08:00
@Buges 有影响,你前端哈希了如何做弱密码禁止相关的策略? 写个 5M 的 js 来个穷举?
Buges
2022-05-24 22:12:57 +08:00
@GeruzoniAnsasu 你扯的太偏了。我上面说了多少遍,加盐 hash ,每个网站每个用户的盐都不一样,哪来的“明文撞出来”、“同样的密文”。要是每个用户都为不同网站使用不同随机密码就没那么多事了,但事实上不是这样,他们的密码常常简单、一样、包含其他隐私信息,你说该不该加盐 hash ?
从用户的角度来说,发送明文(或可还原出明文的密文)密码是无法证明服务商没有存明文的。所以服务商只要注重安全,保持对用户明文密码的 zero knowledge 是至关重要的。access token 和明文密码的区别,不用我再赘述。
至于密码管理器怎么和撞库联系起来我暂且蒙古,用了密码管理器你只需要一个足够复杂的主密码(或配合密钥及 yubikey 等介质),该密码从来不在任何其他地方使用,也不会以任何形式传输和存储。你的个人设备根本从无法公网访问,怎么会被撞库?就算你本人是高价值人士,也有 veracrypt 这种提供 plausible deniability 的工具。使用密码管理器可以所有帐户全随机强密码,任何形式的撞库的影响不到你。按你说的那样用一样或有规律的密码,如果对方明文存储,可以以此识别你的身份。
lululau
2022-05-24 22:14:11 +08:00
我只想知道,https 的前提下是怎么做到密码不加密的。。。
Buges
2022-05-24 22:15:04 +08:00
@zpf124 我见过的所有弱密码判断,都是检测字符集范围,就是判断是否有符号、数字、大小写字母这些,没见过什么穷举。
至于已泄露密码判断,发送 hash 后的结果到检测接口即可。
GeruzoniAnsasu
2022-05-24 22:19:48 +08:00
@Buges 如果你没耐心都看完,可以只看这句话:

根据引理 1 ,前端 hash 一下密码没有任何额外作用。
Buges
2022-05-24 22:34:29 +08:00
@GeruzoniAnsasu 你扯一堆晦涩的论证并不能掩盖结论的错误。前端 hash 的作用我上面已经说了很多遍了,“假如你密码足够随机”你是不是忘了还有其他用户的密码不够随机?
你没耐心去看一眼我上面发的 bitwarden 的白皮书的话,思考这个问题:
如果前端不发送 hash 后的结果到后端,我如何证明自己无法解密用户的数据?

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

https://www.v2ex.com/t/854741

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

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

© 2021 V2EX