两次输入身份验证同时使用用户名(可能公开)和密码(保密)。
为了便于比较,假设用户名的长度与密码的长度相同,即n
字符。还假设我们只能使用从 a 到 z 的不区分大小写的字母。如果用户名和密码都保密,那么我们最多需要26^(2n)
试验才能通过身份验证。
现在考虑一个新的身份验证系统,只有一个输入,即长度保密的密码2n
。允许的字符不区分大小写,从 a 到 z。该系统还需要26^(2n)
通过试验。
问题
为什么我们不使用单输入身份验证?
两次输入身份验证同时使用用户名(可能公开)和密码(保密)。
为了便于比较,假设用户名的长度与密码的长度相同,即n
字符。还假设我们只能使用从 a 到 z 的不区分大小写的字母。如果用户名和密码都保密,那么我们最多需要26^(2n)
试验才能通过身份验证。
现在考虑一个新的身份验证系统,只有一个输入,即长度保密的密码2n
。允许的字符不区分大小写,从 a 到 z。该系统还需要26^(2n)
通过试验。
为什么我们不使用单输入身份验证?
注册服务时,您很有可能会收到“此名称已被使用,请选择另一个”或类似的内容。
在您建议的系统中,这会告诉您访问代码正在使用中 - 太好了,打开一个新的浏览器并使用此访问代码登录!你刚刚劫持了别人的账户。
只需尝试更改自己的访问代码,您就可以找到任意数量的现有访问代码。
另外,如果您忘记了访问代码怎么办?如果系统知道您的电子邮件地址并可以向您发送新的访问代码,则可以缓解这种情况,但是您将接近两次输入身份验证;您不妨使用您的电子邮件登录。
用户名是一个标识符,一个标签,表明你是哪个用户,并标识哪些资源属于你(或引用你)。
密码是一种身份验证器,一种证明您被允许假设该用户身份的方式。
用户名不能保密,因为信息系统需要清楚地了解这些知识,以标记资源并授权您使用资源。密码应该是保密的,即使对服务及其运营商也是如此——这就是为什么使用单向函数对存储的密码进行哈希处理的原因。
通过上面的“资源”,我故意具有包容性。对于用户登录,可能是文件和进程;作为数据库用户,您拥有表和其他数据库对象;对于网站,它可能是您的帖子和声誉点。
这个单输入认证系统会很有趣,但它存在一些安全问题:
关键障碍是对唯一性的要求。为了让不同的用户能够登录到他们各自的帐户,登录凭据(通常是用户名 + 密码)必须是唯一的。从理论上讲,这意味着在典型的双输入系统中,只要没有两个用户共享相同的用户名和密码,用户名就不必是唯一的。问题在于,在单输入系统中,唯一可用的凭据是单个密码,这意味着每个用户都需要使用不同的密码,这会引入许多漏洞:
请注意,一个有趣的安全措施是,虽然很容易闯入任意数量的随机账户(如上所述),但在有针对性的攻击中闯入任何一个账户要困难得多。因为密码需要是唯一的,所以在单输入系统中,您最终会得到比在今天的双输入系统中更复杂的密码,并且没有可用于针对特定用户的用户名,所以唯一的方法闯入一个目标帐户将是蛮力进入所有的帐户,直到您碰巧得到您正在寻找的帐户。另外,确认您登录的帐户是您要查找的帐户会更加困难,因为您不能使用用户名作为身份证明。这是一个非常有趣的安全效果,所以很高兴。