为什么我们不使用单输入身份验证?

信息安全 验证
2021-08-27 13:34:30

两次输入身份验证同时使用用户名(可能公开)和密码(保密)。

为了便于比较,假设用户名的长度与密码的长度相同,即n字符。还假设我们只能使用从 a 到 z 的不区分大小写的字母。如果用户名和密码都保密,那么我们最多需要26^(2n)试验才能通过身份验证。

现在考虑一个新的身份验证系统,只有一个输入,即长度保密的密码2n允许的字符不区分大小写,从 a 到 z。该系统还需要26^(2n)通过试验。

问题

为什么我们不使用单输入身份验证?

4个回答

注册服务时,您很有可能会收到“此名称已被使用,请选择另一个”或类似的内容。

在您建议的系统中,这会告诉您访问代码正在使用中 - 太好了,打开一个新的浏览器并使用此访问代码登录!你刚刚劫持了别人的账户。

只需尝试更改自己的访问代码,您就可以找到任意数量的现有访问代码。

另外,如果您忘记了访问代码怎么办?如果系统知道您的电子邮件地址并可以向您发送新的访问代码,则可以缓解这种情况,但是您将接近两次输入身份验证;您不妨使用您的电子邮件登录。

用户名是一个标识符,一个标签,表明你是哪个用户,并标识哪些资源属于你(或引用你)。

密码是一种身份验证器,一种证明您被允许假设该用户身份的方式。

用户名不能保密,因为信息系统需要清楚地了解这些知识,以标记资源并授权您使用资源。密码应该是保密的,即使对服务及其运营商也是如此——这就是为什么使用单向函数对存储的密码进行哈希处理的原因。

通过上面的“资源”,我故意具有包容性。对于用户登录,可能是文件和进程;作为数据库用户,您拥有表和其他数据库对象;对于网站,它可能是您的帖子和声誉点。

我们确实在某些情况下使用它。

一个示例是使用Google 文档的链接功能进行共享该链接包含一个长度为 45 个字母数字字符的访问密钥或文档 ID。这足够长以确保唯一性并使暴力破解变得困难。

这个单输入认证系统会很有趣,但它存在一些安全问题:

关键障碍是对唯一性的要求。为了让不同的用户能够登录到他们各自的帐户,登录凭据(通常是用户名 + 密码)必须是唯一的。从理论上讲,这意味着在典型的双输入系统中,只要没有两个用户共享相同的用户名和密码,用户名就不必是唯一的。问题在于,在单输入系统中,唯一可用的凭据是单个密码,这意味着每个用户都需要使用不同的密码,这会引入许多漏洞:

  1. 您可以假设在任何足够流行的服务中,有人使用了许多明显的密码。只需尝试使用“password”、“12345”和“Beatles”等密码登录,您可能至少可以进入几个帐户。
  2. 正如 SL Barth 所提到的,任何人都可以通过尝试更改密码来找到现有密码,直到遇到“密码已使用”消息。因为密码必须是唯一的,所以您需要阻止用户选择现有密码,从而显示该密码已在使用中。
  3. 字典攻击:这基本上只是第 1 点和第 2 点的逻辑总和。如果您创建了一个帐户,然后有一个脚本尝试使用密码字典更改密码,记录它遇到的每个“已在使用”的密码这样,您可以快速轻松地建立一个包含数千甚至数百万个现有密码的列表,这就是您破解所有这些帐户所需的全部内容。

请注意,一个有趣的安全措施是,虽然很容易闯入任意数量的随机账户(如上所述),但在有针对性的攻击中闯入任何一个账户要困难得多。因为密码需要是唯一的,所以在单输入系统中,您最终会得到比在今天的双输入系统中更复杂的密码,并且没有可用于针对特定用户的用户名,所以唯一的方法闯入一个目标帐户将是蛮力进入所有的帐户,直到您碰巧得到您正在寻找的帐户。另外,确认您登录的帐户是您要查找的帐户会更加困难,因为您不能使用用户名作为身份证明。这是一个非常有趣的安全效果,所以很高兴。