bcrypt nodejs 无法按预期工作

bcrypt nodejs not works as expected

提问人:user846445 提问时间:2/25/2021 最后编辑:user846445 更新时间:2/28/2021 访问量:423

问:

我在我的数据库中生成了哈希密码。在传入的请求中,我用数据库中的哈希密码检查了我的普通输入密码。例如,如果我的输入密码是 XXXX,并且如果在中间添加一些字符,那么 bcrypt 比较方法将返回 false。但是,如果我在输入密码的最后添加一些字符,我的 bcrypt compare 方法将返回 true。请帮助让我知道为什么会发生这种情况。

我的代码。

const bcrypt = require('bcrypt');
const bcryptTest = async () => {
const input = "kw^#Ko38Q7GusXjd%L?DVXM^CVEF8&9c8L%4GupYcV/DZN3U7GN7Zfyd[Fi&yaNzss"

 //let hashedPassword = await bcrypt.hash(input, 12);
 //Hashed password generated from above
const hashedPassword = "$2b$12$GAFB9ahYHuu.2XQN5fqHoufHQUBuf2a8awNp67hJIN0xP77S5X2tK"
console.log('Hashed Password', hashedPassword);

const plainText = await bcrypt.compare(input, hashedPassword);
console.log(plainText);
}


节点.js bcrypt

评论

0赞 Stefan 2/25/2021
看看这个 github issue 问题,也许你会找到一些答案,或者你可以发布你的问题。github.com/kelektiv/node.bcrypt.js/issues/860
0赞 Sandeep Patel 2/25/2021
哈希是如何产生的?使用 bcrypt?
0赞 user846445 2/25/2021
是的,它使用 bcrypt @SandeepPatel
0赞 jfriend00 2/25/2021
请显示一个最小的、可重现的示例,包括您用作输入的确切密码和生成哈希值的代码。
0赞 user846445 2/25/2021
@jfriend00 :添加了有问题的代码。请帮忙!!

答:

3赞 Sandeep Patel 2/26/2021 #1

Bcrypt 文档指出-

每个 bcrypt 实现,仅使用字符串的前 72 个字节。匹配密码时,将忽略任何多余的字节。请注意, 这不是前 72 个字符。字符串可以 包含少于 72 个字符,但占用超过 72 个字节 (例如,包含表情符号的 UTF-8 编码字符串)。

输入为 74 字节。因此,当您在中间添加额外的字符时,它实际上会更改输入并返回 false。但最终额外的字符只是被忽略了。

您可以使用以下代码检查长度

let ans = Buffer.byteLength("kw^#Ko38Q7GusXjd%L? 
 DVXM^CVEF8&9c8L%4GupYcV/DZN3U7GN7Zfyd[Fi&yaNzss")
 console.log(ans)

评论

0赞 user846445 3/1/2021
是的,你是对的。缩短了密码字段,它起作用了。