【问题标题】:How can I retrieve the real password from a hashed password?如何从散列密码中检索真实密码?
【发布时间】:2017-01-07 22:39:45
【问题描述】:

我想创建一个混合移动应用程序,其中后端是 Node js,它将数据保存在 mongodb 中。我的服务器工作正常,我准备了处理用户请求的路由。

我正在使用 bcrypt 在 mongodb 中存储密码哈希。密码保存正确,但我的问题是我无法检索真正的密码,例如,当管理员将 GET 请求传递给节点 js 服务器以获取用户数据时,他在前端获得了哈希密码。

这是前端的结果:

这是存储密码哈希的代码:

UserSchema.pre('save', function (next) {
    var user = this;
    if (this.isModified('password') || this.isNew) {
        bcrypt.genSalt(10, function (err, salt) {
            if (err) {
                return next(err);
            }
            bcrypt.hash(user.password, salt, function (err, hash) {
                if (err) {
                    return next(err);
                }
                user.password = hash;
                next();
            });
        });
    } else {
        return next();
    }
}); 

请问如何找回真实密码?

【问题讨论】:

  • 存储散列密码的关键在于您无法恢复原始密码。
  • 不要尝试找回密码,您可以提供密码,加密并与已保存的密码匹配。

标签: angularjs node.js mongodb express bcrypt


【解决方案1】:

这就是散列的意义……“不可逆转地”使密码变形。如果它是一个普通的哈希,你应该能够使用彩虹表或其他类似的方法来破解它。如果您使用“盐”对密码进行哈希处理,我相信您破解密码的机会就更渺茫了。

尤其是使用河豚密码的 bcrypt,是一种非常有效的散列算法。

哈希密码已成为一种标准,因此网站所有者实际上无法访问纯密码。

还有一个后续问题:为什么?

【讨论】:

  • Bcrypt 也进行迭代,使得操作需要大量时间,这是关键点。仅对密码进行哈希处理,即使使用盐也不足以保护它们,有 1000 万个常用密码的列表,仅哈希处理非常快,我的笔记本电脑每秒可以执行 700K SHA-256 哈希。进一步专门的程序来运行它们。
【解决方案2】:

你不能。按照设计,散列函数,尤其是加密散列函数,是不可逆的,或one-way function。设计的加密哈希函数具有以下属性

  • 可以快速计算任何给定输入的哈希值
  • 从哈希值生成输入是不可行的,除非通过 尝试所有可能的输入
  • 对输入的小改动应该会广泛地改变哈希值,以至于新的哈希值看起来与旧的哈希值不相关
  • 不可能找到两个具有相同哈希值的不同输入

这是保护密码存储的许多关键部分之一。例如,如果攻击者获得了对您服务器的访问权限,从而能够对您的数据库运行任意查询,则适当的加密哈希函数可确保攻击者无法检索您的用户密码。

来源:Wikipedia - Cryptographic hash function

【讨论】:

    【解决方案3】:

    你不能。这就是密码哈希的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 2017-11-16
      • 2011-07-26
      • 2011-02-18
      • 2019-02-15
      • 2013-11-23
      • 2021-09-26
      • 2021-05-19
      相关资源
      最近更新 更多