如何从哈希密码中检索真实密码?

Tah*_*aha -5 bcrypt mongodb node.js express angularjs

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

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

这是前端的结果:

在此输入图像描述

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

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();
    }
}); 
Run Code Online (Sandbox Code Playgroud)

请问如何检索真实密码?

Mon*_*nic 5

你不能。这就是密码散列的目的。


Tom*_*ijs 5

这就是散列的重点......"不可逆转地"使密码变形.如果它是一个普通的哈希,你应该能够使用rainbowtables或其他类型的方法来破解它.如果您使用'salt'来密码密码,我相信您破解密码的可能性会更小.

特别是使用河豚密码的bcrypt,是一种非常有效的哈希算法.

散列密码已成为标准,因此网站所有者实际上无法访问普通密码.

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


JSF*_*JSF 5

你不能。根据设计,散列函数,尤其是加密散列函数,是不可逆的或单向函数。设计的加密散列函数具有以下属性

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

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

来源:维基百科 - 加密哈希函数