【问题标题】:Bcrypt not that secure at hashing passwords?Bcrypt 在散列密码时不是那么安全吗?
【发布时间】:2013-07-17 00:38:00
【问题描述】:

我正在使用 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

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

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

hash(salt + password)

不是:

salt + hash(password)

【问题讨论】:

    标签: javascript passwords cryptography bcrypt


    【解决方案1】:

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

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

    salt + hash(salt + password)
    

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2021-06-04
      相关资源
      最近更新 更多