使用哈希而不是登录密码进行身份验证?

使用哈希而不是登录密码进行身份验证?

我考虑了针对网站\网络服务器的简单身份验证的想法。

用户点击创建个人资料

网站引擎会从一组随机的 20 个单词中生成哈希值,例如

7a639b05f08394030e8bd81f411eb44025b0df1d1809d618993f10624a020ace

用户在登录字段中输入哈希值或使用链接登录

site.com/login/7a639b05f08394030e8bd81f411eb44025b0df1d1809d618993f10624a020ace

使用哈希而不是登录密码对是否安全?

答案1

如果字符串足够长,这也许能实现您的要求,但实际上您创建了一个无人能可靠登录的网站。您使用的是散列而不是某种提供 x 长度字符串的唯一值生成器,这对情况没有影响。散列值中包含的短语数量也没有影响。

哈希的全部意义在于验证用户输入,而不是输入本身。您的建议容易受到暴力破解,并且除了组合用户名和密码之外不会完成任何事情。您可能只拥有一个密码数据库,并根据输入的密码匹配人员,这永远不会与其他用户的密码匹配,因为它现在是您帐户数据库中用户的主要身份。

想象一下,我在一个普通网站上注册了一个用户账户,并输入了用户名和密码。该网站从不存储我的密码,但会计算其哈希值并存储该哈希值。当我尝试登录时,我会发送我的用户名和密码。远程服务器会对我提交的密码进行哈希处理,查找我的用户名并从账户数据库中检索现有哈希值,然后进行比较。如果它们匹配,则我通过了身份验证。请注意,我提供了密码并且它计算出相同的哈希值非常重要。这就是服务器知道我知道密码的方式。另请注意,服务器没有我的密码。有权访问其数据库的人无法以我的身份登录,因为合适的哈希算法是不可逆的。

有些系统接受长字符串作为身份验证(非常大的密钥空间会使暴力破解变得困难),因此如果您的用户数量很少,那么复杂的序​​列就足够了。这个概念通常用于用于对 Web 资源进行身份验证的“API 密钥”,但这些密钥只是一个文字值。它们就是密码本身。您获取它们的方法并不重要,只要对手无法预测它们即可。

因此,散列实际上与这里的问题或解决方案无关。如果您想使用相同的长值进行用户识别和身份验证,这取决于您,但请记住,在您的方案下,任何两个用户都不能允许拥有相同的...好吧,我们称之为“身份字符串”,因为这基本上就是您现在使用它的原因。您可能只需要长用户名,任何知道(或猜测)现有用户名的人都会自动被允许进入。

请记住,密码的强度只与其本身的强度相同character-set^length。但用户名和密码的强度与它相同username's character-ser^length * the passwords character-Set^length。通过要求攻击者正确猜出两者,您将难度乘以巨大的值。

相关内容