Я сгенерировал хэш-пароль в своей базе данных. Во входящем запросе я проверил свой простой пароль ввода с хешированным паролем в базе данных. Например, если мой входной пароль - XXXX, и если добавить несколько символов в середине, тогда метод сравнения bcrypt вернет false. Но если я добавлю несколько символов к последнему в свой входной пароль, мой метод сравнения bcrypt вернет 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);
}


3
user846445 25 Фев 2021 в 06:56

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)
2
Sandeep Patel 27 Фев 2021 в 22:06