javascript - 如果哈希密码在数据库中,则可以在登录时在输入框中使用该哈希密码

标签 javascript node.js mongodb express hash

我读过this is the module (bcrypt)用来登录和保存密码。据我了解,它解决的主要问题是,如果黑客可以访问您的数据库并且您不对密码进行哈希处理,那么黑客可以轻松地复制并粘贴用户名和密码来访问该帐户。该模块提供了比较散列字符串和通过req.body.password发送的密码的方法。

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

最佳答案

底漆

好的,让我们首先看一下实际发生的情况(在最佳情况下,尽管略有简化):


用户创建一个新密码。
您的应用程序对密码进行哈希处理,并保留哈希密码以供进一步阅读
如果用户登录,则应用程序将使用用户提供的密码,然后通过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,即使是相同的输入数据也不会产生相同的哈希值-这是一种相当先进的哈希算法。 The two hashed above were created from the same input。之所以可行,是因为每个哈希都包含自己的(伪随机生成的iirc)salt。这将迫使攻击者对发现的每个盐值进行暴力攻击,以识别相同的值或明文值。


因此,通过散列,我们使拥有读取访问权限的攻击者无法仅通过查看散列值(否则它们似乎是bcrypt散列值)来获取有关密码的任何信息。

攻击者获得了对数据库的写访问权

好吧,你被刺了。攻击者获得了写访问权限。他可以破坏您的应用程序,复制所有数据,然后将其删除。希望您拥有当前的备份并能正常工作。

现在,他可以简单地为“ admin”和“ jdoe”设置一个新的bcrypt哈希,并且他可以执行那些用户可以执行的任何操作。 h!

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

结论

通过存储bcrypt密码哈希,我们具有以下优点:


密码对管理员隐藏
即使攻击者获得了哈希值,他也无法轻松计算出明文密码
攻击者无法推断出相同的密码,因为即使输入相同,每个输入值也会产生不同的哈希值。因此,他必须为每个盐值进行蛮力测试。往上看。
当攻击者仅获得读取访问权限时,他将无法访问该应用程序。


希望这样可以使存储哈希密码的优势更加明确。

关于javascript - 如果哈希密码在数据库中,则可以在登录时在输入框中使用该哈希密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34833340/

相关文章:

javascript - 如何从文件中获取 JSON 数据以显示在 HTML 页面上

html - 如何在nodeJS中获取多个图像?

node.js - NodeJS 集群将所有请求发送给一个工作人员 (Windows)

regex - 在 mongodb 聚合中的 $expr 中使用 $regex

c# - 唯一性在 NoSQL 世界中意味着什么,我如何处理 MongoDB 中的关系?

javascript - web2py控件表单,选择选项时显示字段

javascript - 让 jquery mmenu 在 768px 以上的正常文档流中显示

javascript - 网页无限滚动时如何让Apify Crawler滚动整页?

mysql - 重复键更新时的 Node Mysql 仅更新唯一行

MongoDB 提示、技巧和陷阱