如何从散列密码中检索真实密码?

时间:2016-08-31 11:05:20

标签: angularjs node.js mongodb express bcrypt

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

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

这是前端的结果:

enter image description here

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

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();
    }
}); 

请问如何检索真实密码?

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:4)

你做不到。这是密码散列的目的。

答案 2 :(得分:4)

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

  • 可以快速计算任何给定输入的哈希值
  • 从哈希值生成输入是不可行的,除了 尝试所有可能的输入
  • 对输入的微小更改应更改哈希值,以使新哈希值与旧哈希值不相关
  • 找到具有相同哈希值的两个不同输入
  • 是不可行的

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

来源:Wikipedia - Cryptographic hash function