【问题标题】:Copy password hashed by bcrypt复制 bcrypt 散列的密码
【发布时间】:2015-03-23 22:51:42
【问题描述】:

我正在使用类似的方式存储我的密码

var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync('password', salt); //hash = $2a$10$MCNmLPkgiZ9jH9/0x4ZVJOvxYratODHJbcC6.X3vIDoxOfFwBYCpK

我想将我的数据库移动到另一台机器上,然后砰!我所有的密码都是错误的

如果我在新机器上执行相同的代码,我会得到不同的哈希值,这很重要吗?

var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync('password', salt); //hash = $2a$10$LLi4TyJ1oP69HQMkPpsExO4hinwW3SmURR0mqmB1ranCJX3ed5oDC

【问题讨论】:

  • 您知道哈希应该每次都不同,对吗?哈希是否不同并不重要,因为您应该使用compare 方法来检查它们。
  • 需要Salt来缓解哈希表攻击。 bcrypt.genSaltSync 使用随机函数生成盐,因此它是不同的,因为两台计算机很少共享随机生成器。要解决这个问题,你必须找出旧机器上的盐是什么,并在新机器上设置相同,然后一切都会正常。

标签: node.js bcrypt


【解决方案1】:

这是设计使然。检查密码的工作流程不涉及生成新的盐,仅在检查明文是否正确时使用现有的盐。

来自wikipedia on password salts

了解破解单个密码和破解密码的区别 一组,考虑一个包含数百个密码文件 用户名和密码。没有盐,攻击者可以计算 hash(attempt[0]),然后检查该哈希是否出现在 文件。匹配的可能性,即破解其中一个 尝试的密码,随着密码数量的增加而增加 文件。如果存在盐,那么攻击者将不得不 计算哈希(盐[a] .尝试[0]),其中“。”表示串联, 与条目 A 比较,然后 hash(salt[b] .attempt[0]),比较 反对条目 B,依此类推。这会在尝试中击败“重用”哈希 破解多个密码。

【讨论】:

    【解决方案2】:

    了解变量salt

    假设您的数据库将用户 X 的密码存储为hash('mypass')

    入侵者获得了您的数据库,并获得了散列密码。现在他可以运行Rainbow Attack,如果他预先计算的Rainbow表包含密码'mypass',他将很容易找出用户X使用的密码。

    为了缓解,您可以将密码存储为hash('mypass' + 'SERVER_CONSTANT') 即使入侵者可以访问'SERVER_CONSTANT',它也完全可以击败彩虹攻击。它现在是必需的标准,称为Salt

    bcrypt.genSalt(Sync) 方法根据服务器硬件的独特属性生成 Salt。 genSalt 对于每台计算机都是不同的(否则它会破坏 Salt 的用途)。


    解决方案:

    console.log(bcrypt.genSaltSync(10)) 在你的旧机器上。假设它是ABCDE

    然后在您的新服务器上执行:var salt = 'ABCDE'。使用常量而不是 genSalt 是安全的,但您必须将其保密(在公共存储库之外等)。

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 2021-06-04
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      相关资源
      最近更新 更多