我看一下网站\网络服务器的简单身份验证的想法。
用户单击Create profile。
网站引擎从一组随机的 20 个单词中生成哈希,例如
7a639b05f08394030e8bd81f411eb44025b0df1d1809d618993f10624a020ace
用户在登录字段中输入哈希或使用链接登录
site.com/login/7a639b05f08394030e8bd81f411eb44025b0df1d1809d618993f10624a020ace
使用哈希而不是登录密码对是否安全?
如果字符串足够长,这可能会实现您想要的,但是您将有效地创建一个人类无法可靠登录的站点。您正在使用散列而不是某种提供 x 长度字符串的唯一值生成器对这种情况没有影响。哈希值中包含的短语数量也没有。
哈希的重点是验证用户输入,而不是输入本身。您的建议很容易受到蛮力攻击,除了结合用户名和密码外,什么也做不了。您还不如只拥有一个密码数据库,并根据输入的密码匹配人员,这永远不会匹配其他用户的密码,因为它现在是您帐户数据库中的用户主要标识。
所以想象一下我在普通网站上注册了一个用户帐户,并输入了用户名和密码。该站点从不存储我的密码,但会在其上计算哈希值并存储该哈希值。当我尝试登录时,我会发送我的用户名和密码。远程服务器对我提交的密码进行哈希处理,查找我的用户名并从帐户数据库中检索现有哈希,然后进行比较。如果它们匹配,我就通过了身份验证。请注意,重要的是我提供了密码,并且它计算到相同的哈希值。这就是服务器知道我知道密码的方式。另请注意,服务器没有我的密码。有权访问其数据库的人无法以我的身份登录,因为拟合哈希算法是不可逆的。
有些系统接受长字符串作为身份验证(非常大的密钥空间会使暴力破解成为问题),因此如果您的用户数量很少,复杂的序列就足够了。这个概念经常用在用于对 Web 资源进行身份验证的“API 密钥”中,但这些密钥只是一个字面值。它们就是密码本身。只要对手无法预测它们,您获得它们的方法并不重要。
所以散列实际上与这里的问题或解决方案无关。如果您想为用户识别和身份验证使用相同的长值,这取决于您,但请记住,在您的方案下,不允许两个用户拥有相同的值......好吧,我们称之为“身份字符串“因为这基本上就是您现在使用它的目的。您可能只需要长的用户名,并且任何知道(或猜测)现有用户名的人都会被自动允许进入。
请记住,密码只有
character-set^length
. 但是用户名和密码具有username's character-ser^length * the passwords character-Set^length
. 通过要求攻击者正确猜测两者,您将难度乘以巨大的价值。