node.js - 节点 bcryptjs 不是确定性的?
问题描述
我曾经使用 brypt 进行密码验证。由于某些原因,我无法再将它安装在多台机器上。无论如何,我安装了 bcryptjs。
const bcrypt = require('bcryptjs')
const salt = bcrypt.genSaltSync(10);
const hash = bcrypt.hashSync("hallo", salt);
console.log(hash);
我运行了六次代码,得到了这六个输出:
$2a$10$SnIj6q67OvPXINLeajqONebAjZltLwrqs8OU/5C871NyTib.SJeyu
$2a$10$8aLhlLvYi5RcuV40SansxOuQroS.SPmPG6GMjsRlcndjjzRSJkFRu
$2a$10$wZJCuAUwtG9v.oh8tgZ9M.unYBe/MRv0jO3IU51gLz8XI1ClYJni6
$2a$10$mGhPf85kGpn/PBdV3JjDsuXypnQ.E2pBTEoDtDZ/eW6qsq5DAb6M6
$2a$10$WkEro4eOiuqzE0.hB/ka2eyPUpWE/Dv5dWkqSZ3yujQ2PA3iRYJMC
$2a$10$l4GVALWSvWdcOin37WXsQeIufA7SHxvhU.9dIasXspsSPi1e1/IeG
但是这个额外的代码实际上比较它是正确的方式
const hallo = bcrypt.compareSync("hallo", hash);
console.log(hallo); //always true
const burger = bcrypt.compareSync("burger", hash);
console.log(burger); //always false
bcrypt 如何实际将哈希与字符串进行比较?它只看前 7 个相同的字符吗?
谢谢
阿米特
解决方案
这是对的。Bcrypt 是一个加盐哈希,盐是随机生成的。这意味着每次运行哈希都会得到一个随机结果。这是故意的。
.
(点)之前和最后一个之后的散列部分$
是嵌入的盐。您不需要单独存储盐,因为它是哈希的一部分。由于盐是正确随机生成的,因此您可以完全防止彩虹表攻击。
bcrypt 检查哈希的方式是首先提取嵌入的盐。然后再次通过算法运行字符串和盐。如果生成的散列与散列匹配,则它通过。
推荐阅读
- c++ - 我将如何增加一个类中的单独变量,而不是对象本身?
- python - 循环插值然后更新值
- javascript - toISOString 方法返回前面为零的年份
- flutter - gradle build error [致命错误] checker-qual-2.5.2.pom:2:1: prolog 中不允许内容
- css - 如何在悬停 CSS 上实现平滑的边框动画?
- javascript - 如何在不触发 js 中的 onclick 的情况下单击 HTML 元素?
- excel - 循环通过 NextSibling DIV 标记名 Selenium VBA
- flutter - Flutter:如何显示和隐藏 Lottie 动画
- html - 隐藏 input[type='file'] 的选择文件按钮,而不用简单的 css 隐藏文件选择的名称
- javascript - 两个javascript函数的冲突