javascript - Bcrypt 在散列密码时不那么安全吗?

标签 javascript passwords cryptography bcrypt

我正在使用 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");
    });
  });
});

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

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

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

hash(salt + password)

不是:

salt + hash(password)

最佳答案

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

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

salt + hash(salt + password)

如果攻击者获得了对这些数据的访问权,那么:

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

关于javascript - Bcrypt 在散列密码时不那么安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717073/

相关文章:

javascript - 在 CycleJS 中用 localStorage 的初始值折叠

javascript - 提交表单时显示图像?

hash - 2个不同输入的哈希值可以相同吗?

c# - 如何在 C# 的 connectionStrings Web.config/App.config 中仅加密和解密密码?

ruby-on-rails - rails : has_secure_password override

c# - System.Security.Cryptography.RSA.Encrypt 方法中是否假定 MGF1 填充与 RSAEncryptionPadding.OaepSHA256?

Javascript 作用域和 this.Variable

javascript - 来自 GitHub 页面的 API 请求不起作用 ("mixed block")

c - 在本地安全地存储密码

PHP - 安全地存储外部服务的密码?