【问题标题】:bcrypt nodejs not works as expectedbcrypt nodejs 无法按预期工作
【发布时间】:2021-02-25 03:56:25
【问题描述】:

我在我的数据库中生成了哈希密码。在传入的请求中,我使用数据库中的散列密码检查了我的普通输入密码。例如,如果我的输入密码是 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);
}


【问题讨论】:

  • 看看这个github issue,也许你会找到一些答案,或者你可以发布你的问题。 github.com/kelektiv/node.bcrypt.js/issues/860
  • Hash是如何产生的?使用 bcrypt?
  • 是的,它使用 bcrypt @SandeepPatel
  • 请显示minimal, reproducible example,包括您用作输入的确切密码以及生成哈希的代码。
  • @jfriend00 :添加了相关代码。请帮忙!!!

标签: node.js bcrypt


【解决方案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)

【讨论】:

  • 是的,你是对的。缩短了密码字段并且它起作用了。
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2013-12-23
  • 2014-12-09
相关资源
最近更新 更多