为什么主要网站(Facebook、Google 等)仍然发送未经哈希处理的密码?

信息安全 tls 加密 哈希 密码
2021-09-03 04:58:54

快速总结:

似乎现代网站,为了安全起见,都应该让客户端在将它们发送到服务器之前对自己的密码进行哈希处理,服务器将对其进行重新哈希处理,以避免泄露原始密码(可能在不同站点之间重复使用),并且还需要单独解密,而不是简单地解密单个 SSL 密钥。

原始问题:

只是做了一个快速检查以确保,我惊讶地发现主要网站似乎仍在以原始格式发送登录密码,尽管是通过 SSL/TLS。我知道他们在将它们放入数据库之前会对它们进行散列和盐渍/胡椒粉。但是,我仍然看到一个问题。

似乎在发送之前在客户端使用站点唯一盐对所有密码进行哈希处理,然后对客户端进行哈希处理会更加安全,尤其是鉴于最近的新闻

美国国家安全局及其盟友经常拦截此类连接——数以百万计。根据美国国家安全局的一份文件,该机构打算在 2012 年底之前每天破解 1000 万个被截获的 https 连接。情报部门对用户输入密码的那一刻特别感兴趣到 2012 年底,该系统应该能够“检测至少 100 个基于密码的加密应用程序的存在”,每个实例每月大约 20,000 次。(重点补充)

虽然我理解从效率的角度来看,让客户端散列密码是不必要的,但我更感兴趣的是散列原始密码意味着即使数据被截获,无论是在服务器上,预散列,或者在连接期间解密 SSL,它只对登录被拦截的网站有用。

考虑到很多人重复使用密码,我认为这应该是一个主要问题,但这些大型网站仍在发送原始密码并在其末端进行哈希处理。这背后是否有技术原因,或者只是旧的做法应该理想地改变?

澄清编辑:我并不是建议这些网站开始在客户端进行所有散列并按原样将其放入他们的数据库中,他们绝对应该对散列进行散列/加盐。我的建议是客户端对密码进行哈希处理,以便服务器不知道原始数据是什么,因此可以重复使用相同的密码,并且在一个网站上的妥协并不意味着在其他网站上对您的密码的妥协。作为一个很好的奖励,它还将限制恶意代理发现的对登录网站的访问,而不是把你的密码交给他们。

1个回答

我们必须区分以下两种情况:

1) 一个坚定的黑客试图获取密码

在这种情况下,SSL 通常可以提供足够的保护,实施良好的 SSL 很难破解。一旦攻击者成功发起 ManInTheMiddle 攻击,客户端哈希无论如何都不会得到更多保护,因为攻击者可以轻松删除计算哈希的 (JS) 脚本。

2) 开始自动攻击

如果有一个能够读取 SSL 流量的组织,计算客户端哈希会增加他们的成本,因为在自动攻击中他们只会看到密码的哈希。只要他们对某个站点的兴趣足够大,他们就可以编写代码来自动删除该站点的脚本。

如果他们只有哈希,他们仍然可以尝试暴力破解这个哈希。由于您可能会使用快速哈希客户端 (SHA*),因此暴力破解应该相对容易。使用慢速散列(PBKDF2 或 BCrypt)很难实现,使用像 JS 这样的慢速客户端语言。即使您要计算慢速哈希客户端,您也必须减少服务器端的时间,因为您不想让用户等待太久。用客户端散列交易服务器端散列会降低安全性,因为服务器端散列可以比客户端散列更快(更多轮)完成。

➽ 这意味着你可以让他们的生活更艰难,但如果他们的兴趣足够大,你就无法阻止他们。如果用户具有安全意识并选择了非常强的密码,客户端哈希可能会有所帮助,但该用户可能不会重复使用密码。