2012-01-06 83 views
2

我想为用户创建更改密码页面。我在数据库(mongodb)中保存用户时加密密码。如何解密Node.js中的加密密码

User.virtual('password') 
    .set(function(password) { 
     this._password = password; 
     this.salt = this.makeSalt(); 
     this.hashed_password = this.encryptPassword(password); 
    }) 
    .get(function() { return this._password; }); 

    User.method('authenticate', function(plainText) { 
    return this.encryptPassword(plainText) === this.hashed_password; 
    }); 

    User.method('makeSalt', function() { 
    return Math.round((new Date().valueOf() * Math.random())) + ''; 
    }); 

    User.method('encryptPassword', function(password) { 
    return crypto.createHmac('sha1', this.salt).update(password).digest('hex'); 
    }); 

我不知道如何解密它以获取原始密码。任何帮助将不胜感激 。

回答

16

密码是散列的,没有加密,你不能得到原来的回来 - 这是哈希的整个点,这是一个单向函数。你不应该永远不要拿回原来的东西,因为你没有合法的用途。为了验证一个用户,你以与存储用户相同的方式散列他们给你的密码,然后比较散列。

1

我认为这里最好的解决方案是允许用户回答一些安全问题,然后通过点击发送到他们个人资料中的电子邮件的链接来重置密码。他们最终可能会将其设置为相同的密码,但这不是您的担心。这可以让你不必担心乱码。

当然,如果您没有在原始注册表单中提供此信息,这当然会更困难。但是如果你的服务还没有真正推出,这应该很容易实现。