在您输入密码时检查您的密码的网站会带来安全风险吗?

信息安全 tls 密码 侧信道
2021-09-03 03:56:57

当我在登录(而非注册)表单中输入密码时,我使用的一些网站会检查我的密码。因此,例如,首先我可能有:

Username: sapi ✓
Password: passw ×

当我完成打字时,该网站已经让我知道没有错误:

Username: sapi ✓
Password: password123 ✓

仍然需要提交表单才能实际登录。


假设这不是在客户端完成的(例如,通过通知客户端散列算法和目标散列);这种方法显然是不安全的,因为它允许您获取任意用户的哈希值。

假设通信是加密的,在键入时逐字检查密码是否会带来安全风险?


我关心的主要领域是这样做涉及重复传输相似的(子)字符串:

  • 一些开销数据+密码的第一个字母
  • 一些开销数据+密码的第二个字母
  • ...
  • 一些开销数据+整个密码

这使得每个通信的明文在某种程度上具有确定性(或至少与前一个和下一个通信的明文相关)。

我知道一些加密算法容易受到已知明文攻击,尽管我不确定 SSL 是否是其中之一。我也不知道这里获得的知识水平(显然比已知明文攻击要少得多)是否足以降低输出的熵。

我想我有两个问题:

  1. 这是标准网络加密算法(基本上是 https)的安全风险吗?
  2. 如果没有,是否有一类算法可能会带来问题?

我已经对我指的是登录表单而不是注册表单的问题进行了澄清。换句话说,客户端不能简单地使用 JS 根据已知长度/复杂性规则验证密码;该帐户已经存在,并且仅显示正确密码的复选标记。

4个回答

现代密码系统通常不易受到已知明文攻击。在加密算法方面,TLS中常用的基本有3种算法:

  1. AES
  2. RC4
  3. DES(在 3DES 中)

所有这三种都被认为可以抵抗已知明文攻击,并且已经针对此类攻击进行了充分研究。

我想知道的一件事是旁道攻击。(可能)有几位关于您的密码的信息被泄露,但我能想到的所有信息都需要能够观察您的流量的攻击者(当然,您询问的已知明文攻击也是如此)。

  1. 如果启用了 TLS 压缩(考虑到 CRIME 攻击,它确实不应该启用)并且攻击者能够正确猜测您的请求中发送的所有其他数据(如果没有唯一的 cookie,这并不难)那么它就是他们可能能够通过发送子字符串并查看哪些压缩到与您的密码相同的长度来找出您的密码。

  2. 定时攻击。根据您键入击键和键入模式后 JavaScript 向服务器发送请求的速度,攻击者可能能够根据数据包之间的间隔(这表明击键之间的间隔)。Song 等人针对 SSH 演示了这种攻击。人。在 2001 年,所以它并不完全新颖,只是 HTTPS 的新颖。(HTTPS 通常不是实时的,但您所描述的使其接近实时。)

  3. 密码的长度。攻击者可以测量发送到服务器的包的数量及其大小,并根据输入的字符数很好地猜测长度。知道密码的长度会将基数减少 1。因此,攻击者不必猜测 11^5 个密码,而只需猜测 10^5 个密码即可获得数字密码。

总的来说,这不是我会担心的。这个网站更容易受到 XSS、SQL 注入、会话管理漏洞等的攻击,而不是攻击者会使用这种来回技术来破坏您的帐户。

如果没有别的,它是一个用于检查密码的 API,没有任何时间延迟必须是这样的:如果他们在每次猜错后都有时间延迟,那将失去实时检查密码的意义。如果您的密码是“密码”,那么服务器必须检查七个错误的密码才能找到正确的密码,并且您不能承受每次按键后的延迟。用户可以通过从其他地方剪切/粘贴密码来绕过这一点,但这不是我们想要鼓励的行为。

出于类似的原因,这个 API 几乎肯定不会在重复错误猜测后阻止人们即使是这样,门槛也可能高得令人无法接受。基于恶意软件的破解程序在这里工作得特别好:它可以抓取用户的硬盘驱动器以获取可能的密码,然后模拟剪切/粘贴,这样它只会浪费每个密码的一次猜测,而不是长度 - 1次猜测。

实施这种检查器的人是善意的,但其背后的概念存在根本缺陷。没有人应该这样做。您只是在向恶意攻击敞开大门,而没有真正的用户体验收益。

也许是一个愚蠢的问题,但您确定您没有得到 ✓ 表示您输入的密码符合网站密码政策的最低要求吗?这样客户端代码就会说“是的,这是一个有效的密码,我会接受它,尽管我尚未验证其正确性。” 当您输入密码为“password1234”时,它仍然是✓吗?

我可以在这里看到一个严重的问题:您可以在服务器执行繁重的工作时尝试暴力破解。在足够强大的服务器的情况下,攻击者很有可能以很少或没有(客户端)计算成本获得成功。如果服务器太弱,它会为拒绝服务攻击打开一个很好的通道。

上次我检查时,在返回结果之前引入少量(随机)睡眠被认为是一种好习惯;检查输入的每个字符的密码似乎可以从这里开始。