bcrypt nodejs 无法按预期工作

问题描述

我将哈希密码生成到我的数据库中。在传入的请求中,我使用数据库中的散列密码检查了我的纯输入密码。例如,如果我输入的密码是 XXXX 并且如果在中间添加一些字符,则 bcrypt compare 方法返回 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);
}


解决方法

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)