Bcrypt在散列密码时不安全吗?

时间:2013-07-18 07:20:14

标签: javascript passwords cryptography bcrypt

我正在使用bcrypt生成salt和hash密码,但我不认为它是非常安全的。 当我使用以下代码时:

bcrypt.genSalt(10, function(err, salt) {
  user.salt = salt;
  bcrypt.hash(password, salt, function(err, hash) {
    user.hashed_password = hash;
    console.log(user.salt);
    console.log(user.hashed_password);
    user.save(function(err) {
      if (err) console.log(err);
      console.log("saved");
    });
  });
});

在一个示例中,salt为:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMO,hashed_pa​​ssword为:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMOVnlv9cKgAFdCQ5xdtlP6UoKz90i1FMu

散列密码的开头与salt完全相同。如果攻击者有权访问salt,他是否只能从hashed_pa​​ssword中删除盐并强制使用或使用预定哈希值的表来确定密码?

我一直以为这应该是哈希密码的顺序:

hash(salt + password)

salt + hash(password)

1 个答案:

答案 0 :(得分:17)

哈希密码的开头是盐,因为您需要访问盐以验证密码。

您看到的数据既不是哈希(盐+密码)也不是盐+哈希(密码) - 它的格式为

salt + hash(salt + password)

如果攻击者获得对此数据的访问权限,则:

  • 他们当然(理论上)可以强制使用密码 - 没有任何技术可以防止这种情况,但速率限制会使攻击变得不切实际。此实例中使用的哈希函数专门设计为需要很长时间才能运行,间接限制攻击速度。
  • 他们无法使用标准的哈希表来查找密码 - 这是因为哈希值还包含唯一的盐。当然盐在那里是明确的,所以可以计算一个表,但由于盐也是每个散列密码的唯一,这不比蛮力攻击更好。