比较密码时Bcrypt给出错误

时间:2017-09-29 18:11:14

标签: javascript node.js bcrypt

我正在使用bcrypt在我的应用程序中实现Promise接口。

当我尝试比较密码时,即使密码相同,我也会收到错误。

const bcrypt = require('bcrypt');
const saltRounds = 10;
const password = 'secret';
const resHash = ''
/**
 * Generate Password
 */
bcrypt.hash(password, saltRounds).then((res) => {
    console.log(res)
    this.resHash = res
}).catch(err => {
    console.log(err)
})

/**
 * Compare Password
 */
bcrypt.compare(password, resHash).then((res) => {
    console.log("Comparison result: " + res)
}).catch(err => {
    console.log(err)
})

我得到以下输出:

Comparison result: false
boolean
$2a$10$n0mnrLHT3rRkREKB8RJXouMFrhNQjqOFeN7Sq.a.BYXigdBhcBkfq

我在上面的例子中做的任何建议是错误的吗?

2 个答案:

答案 0 :(得分:1)

在将它加到哈希方法之前,你必须首先使用bcrypt生成的盐。

const bcrypt = require('bcrypt');
const saltRounds = 10;
const password = 'secret';
let resHash = '';

bcrypt.genSalt(saltRounds).then(generatedSalt => {
    bcrypt.hash(password, generatedSalt).then(res => {
        console.log(res)
        resHash = res;
    }).catch(err => {
        console.log(err);
    });
}).catch(err => {
    console.log(err);
});

// a promise is async. this will not sequentially be executed
// to test. use delay
setTimeout(function () {
    bcrypt.compare(password, resHash).then(res => {
        console.log("Comparison result: " + res)
    }).catch(err => {
        console.log(err)
    });
}, 2000);

查看lifecycles了解详情。

答案 1 :(得分:1)

如果您正在执行上述代码,就像您在此处执行代码一样,它将无法正常工作,因为密码比较会立即触发,而不是等待第一个解决的承诺。此外,您设置的是this.resHash,而不是尝试设置常量resHash,而let resHash应为const bcrypt = require('bcrypt'); const saltRounds = 10; const password = 'secret'; let resHash = '' /** * Generate Password */ bcrypt.hash(password, saltRounds).then((res) => { resHash = res; return bcrypt.compare(password, resHash); }).then(matches => { console.log('Matches', matches) // true }).catch(err => { console.log(err) })

http://x.y.z/list?type=0&period=1&min=3000&max=21000&area=6855+7470+7700