Bcrypt在散列密码方面并不那么安全

Bcrypt not that secure at hashing passwords?

本文关键字:安全 方面 密码 Bcrypt      更新时间:2023-09-26

我正在使用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_password是:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMOVnlv9cKgAFdCQ5xdtlP6UoKz90i1FMu

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

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

hash(salt + password)

不:

salt + hash(password)

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

你看到的数据既不是哈希(盐+密码(

也不是盐+哈希(密码(——它的形式是

salt + hash(salt + password)

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

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