首页 > 解决方案 > 节点 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 个相同的字符吗?

谢谢

阿米特

标签: node.jsbcrypt

解决方案


这是对的。Bcrypt 是一个加盐哈希,盐是随机生成的。这意味着每次运行哈希都会得到一个随机结果。这是故意的。

.(点)之前和最后一个之后的散列部分$是嵌入的盐。您不需要单独存储盐,因为它是哈希的一部分。由于盐是正确随机生成的,因此您可以完全防止彩虹表攻击。

bcrypt 检查哈希的方式是首先提取嵌入的盐。然后再次通过算法运行字符串和盐。如果生成的散列与散列匹配,则它通过。


推荐阅读