5

我正在使用 bcrypt 生成盐和哈希密码,但我不认为它这样做很安全。当我使用以下代码时:

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");
    });
  });
});

在一个示例中,盐是:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMO并且 hashed_pa​​ssword 是:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMOVnlv9cKgAFdCQ5xdtlP6UoKz90i1FMu

哈希密码的开头与盐完全相同。如果攻击者可以访问盐,他不能只是从 hashed_pa​​ssword 中删除盐,然后暴力破解或使用预先确定的散列值表来确​​定密码吗?

我一直认为这应该是散列密码的顺序:

hash(salt + password)

不是:

salt + hash(password)
4

1 回答 1

17

散列密码的开头是 salt,因为您需要访问 salt 才能验证密码。

您看到的数据既不是 hash (salt + password) 也不是 salt + hash(password) -- 它的形式是

salt + hash(salt + password)

如果攻击者可以访问这些数据,那么:

  • 他们当然可以(理论上)暴力破解密码——没有任何技术可以阻止这一点,但速率限制使攻击变得不切实际。此实例中使用的哈希函数专门设计为需要很长时间才能运行,从而间接限制攻击的速率。
  • 他们不能使用标准的散列表来找出密码——这是因为散列值还包含唯一的盐。当然,盐是明确存在的,因此可以计算出一个表格,但由于盐对于每个散列密码也是唯一的,这并不比暴力攻击好。
于 2013-07-18T07:32:36.140 回答