Javascript 若哈希密码在DB中,恶棍可以在登录时使用输入框中的哈希密码吗

Javascript 若哈希密码在DB中,恶棍可以在登录时使用输入框中的哈希密码吗,javascript,node.js,mongodb,express,hash,Javascript,Node.js,Mongodb,Express,Hash,我读了它,用它来做登录,保存密码的事情。据我所知,它解决的主要问题是,如果黑客能够访问您的数据库,而您没有散列密码,那么黑客就可以轻松地复制和粘贴用户名和密码并访问该帐户。该模块提供了比较哈希字符串和通过req.body.password发送的密码的方法 我对散列的理解是,它需要一个文本并创建一个随机字符的长字符串。在应用程序中,字符串存储在mongoDBpassword字段中,这如何防止黑客将随机字符串复制粘贴到输入框中并像那样登录?所以我不明白散列的意义。如果你的密码、用户名和散列字符串存储

我读了它,用它来做登录,保存密码的事情。据我所知,它解决的主要问题是,如果黑客能够访问您的数据库,而您没有散列密码,那么黑客就可以轻松地复制和粘贴用户名和密码并访问该帐户。该模块提供了比较哈希字符串和通过
req.body.password
发送的密码的方法


我对散列的理解是,它需要一个文本并创建一个随机字符的长字符串。在应用程序中,字符串存储在mongoDB
password
字段中,这如何防止黑客将随机字符串复制粘贴到输入框中并像那样登录?所以我不明白散列的意义。

如果你的密码、用户名和散列字符串存储在数据库中,那么是的,黑客可以使用该散列来解密所有内容。但是,如果有人正在嗅探您的登录/连接,那么他们将不会以明文形式获取您的用户名和密码,也不会获取哈希键。

正如您所说,该函数将创建传递给它的字符串的哈希。散列不是随机的,而是无序的输入,使用相同的算法,输入结果将是相同的,无法解码。如果尝试散列,则散列密码将产生完全不同的结果

md5('password') = '5f4dcc3b5aa765d61d8327deb882cf99'
md5('5f4dcc3b5aa765d61d8327deb882cf99') = '696d29e0940a4957748fe3fc9efd22a3'

当用户想要登录时,他需要发送原始密码。然后,应用程序将再次计算密码的哈希值,并将其与存储的哈希值进行比较。如果用户发送散列,应用程序将再次计算散列,并且它将与数据库中的值不匹配

也许您的困惑来自于使用JavaScript,这表明您在客户端计算哈希值。散列应该在服务器端完成,用户发送原始密码,而不是通过internet发送散列。

Primer 好的,让我们先看看真正发生了什么(在最佳情况下,尽管稍微简化):

  • 用户创建新密码
  • 应用程序对密码进行散列,并保存散列后的密码以供进一步读取
  • 如果用户登录,应用程序将获取用户提供的密码,通过bcrypt运行该密码,bcrypt对该密码进行散列,然后将散列后的密码与存储的密码进行比较。如果它们匹配,则通过登录提供的密码与创建密码时提供的密码相同–这是您唯一需要知道的
  • 因此,有了这一点,我们必须看看不同的攻击场景

    攻击者获得了对数据库的读取权限 好的,攻击者获得了对数据库的读取权限。够糟糕的了。个人资料泄露。实际上,他可以复制所有数据。但是让我们把它放在一边,看看密码。攻击者可能会看到类似的情况

    Username    Password
    admin       $2a$04$acaUVljoRAvazzj6YX7K2eEfUt9PHVVgr.ahZ4xLzb9292u4Bv9Sm
    jdoe        $2a$04$cTUGYHixAGwdTU90XflsI.G2FQuj/p4nVYW2Tp3HsCeUGs5MPmR.e
    
    现在,当且仅当暴力是从哈希值计算输入数据的最简单方法时,哈希函数被认为是加密安全的。随着散列大小和计算能力的今天,你需要很长的时间来计算密码从他们的散列

    按照上面描述的过程,虽然攻击者具有对数据库的读取权限,但他不能简单地获取哈希值并将其粘贴为密码–应用程序将获取哈希值,再次对其进行哈希,随后的匹配检查将失败。福利

  • 在正常操作期间,即使管理员也无法读取用户选择的密码。人们倾向于在多个实例上使用密码。我们都知道我们不应该这样做,但它确实发生了。您希望SO管理员知道您选择的密码吗?;)何况是袭击者
  • 由于攻击者无法通过获取哈希值登录,因此他无法代表合法用户执行某些操作,例如购买某些东西
  • 如果攻击者想要强制哈希值以获得明文密码,则必须投入大量资源。给你一个印象:假设我们可以做65536次哈希/秒,我们有2232次可能性,所以我们需要2.18*1062年来强制执行哈希,这大约是宇宙年龄的1.59*1052倍。即使有很多内核进行并行处理(比如说整个行星系统转换成计算机),也需要非常、非常、非常长的时间
  • 攻击者将无法识别相同的密码,因为使用bcrypt,即使相同的输入数据也不会产生相同的哈希值–这是一种非常先进的哈希算法。这是因为每个散列都包含自己的散列(伪随机生成,iirc)。这将迫使攻击者对每个找到的salt值进行暴力攻击,以识别相同的值或明文值
  • 因此,通过散列,我们使得获得读取权限的攻击者不可能仅通过查看散列值(除了它们似乎是bcrypt散列值)来获取有关密码的任何信息

    攻击者获得了对数据库的写访问权限 好的,你被解雇了。攻击者获得了写访问权限。他可以破坏你的应用程序,复制所有数据,然后删除。希望你有你的备份电流和工作

    现在他可以简单地为“admin”和“jdoe”设置一个新的bcrypt哈希,他可以做那些用户可以做的任何事情。啊

    但让我们看看他不能做什么:与读访问一样,他不能从给定的散列计算明文密码。因此,即使用户在应用程序中使用了相同的密码,攻击者也不会获得对用户的Maskbook、Gibber或Instancense帐户的访问权限

    结论 通过存储bcrypt密码哈希,我们有几个优点:

  • 密码对管理员是隐藏的
  • 即使攻击者获得哈希值,也无法轻松计算明文密码
  • 攻击者不能对identic进行任何扣减