我可以使用 bcrypt 来比较已经散列的密码吗?

问题描述 投票:0回答:1

我是 nodejs 的新手,正在努力解决有关密码哈希的问题。我正在使用 ReactJS 重新创建一个网站并使用 nodejs 作为后端。数据库中有一个名为 userprofiles 的表。它有电子邮件、散列密码、名字、姓氏等。我正在尝试创建登录页面作为开始,我只需要一个登录页面而不是注册页面,因为我已经有了以前数据库中的用户表。我使用 bcrypt 来比较散列密码,但那些密码没有被 bcrypt 散列,因为以前的网站是使用 php 创建的,因为它使用不同的方法来散列密码。我的问题是我可以在登录时使用 bcrypt.compare 来比较我的密码吗?

我还能使用 bcrypt 吗?请就此事告诉我,谢谢。

node.js backend bcrypt login-page
1个回答
0
投票

如果this是您正在使用的

bcrypt.compare()
,那么
bcrypt.compare()
不会比较两个散列密码。

它将纯文本密码与散列密码进行比较。它使用散列密码中的存储参数(例如盐),以便使用相同的盐对纯文本密码进行散列,然后可以比较两个散列。

由于散列密码通常只会在您的服务器上创建,因此通常可以调整您的代码以适应这一点。用户不知道使用的盐,因此他们将提交一个纯文本密码(通常在传输中受 https 保护)。

如果您无法避免比较两个 bcrypt 散列密码,一种可能性是使用 crypto.timingSafeEqual() 之类的东西直接比较两个散列。 bcrypt 由算法标识符、迭代级别、salt 和哈希组成。两个相同的原始密码应该产生相同的 bcrypt 散列值(相同的算法、相同的盐、相同的迭代级别、相同的散列以及因此相同的二进制值)。但是,我自己还没有尝试过。

这是 bcrypt 哈希值的样子:

Resultant hashes will be 60 characters long and they will include
the salt among other parameters, as follows:

$[algorithm]$[cost]$[salt][hash]

2 chars hash algorithm identifier prefix. "$2a$" or "$2b$" indicates BCrypt
Cost-factor (n). Represents the exponent used to determine how many iterations 2^n
16-byte (128-bit) salt, base64 encoded to 22 characters
24-byte (192-bit) hash, base64 encoded to 31 characters

$2b$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |                     |
 |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |
 |  |  salt = nOUIs5kJ7naTuTFkBy1veu
 |  |
 |  cost-factor => 10 = 2^10 rounds
 |
 hash-algorithm identifier => 2b = BCrypt
© www.soinside.com 2019 - 2024. All rights reserved.