javascript 使用带有promises的bcrypt来散列密码,然后验证它

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 使用带有promises的bcrypt来散列密码,然后验证它相关的知识,希望对你有一定的参考价值。

let bcrypt = require('bcrypt-nodejs');

let password = "hello";
let stored_hash = "";

// first generate a random salt
function genSalt(password) {
    return new Promise((resolve,reject) => {
        bcrypt.genSalt(10,function(err,salt) {
            if (err) {
                reject(err);
            }
            else {
                resolve({
                    salt:salt,
                    password:password
                });
            }
        });
    });
}

// hash the password with the salt
function genHash(salt,password) {
    return new Promise((resolve,reject) => {
        bcrypt.hash(password,salt,null,function(err,hash) {
            if (err) {
                reject(err);
            }
            else {
                resolve({
                    salt:salt,
                    password:password,
                    hash:hash
                });
            }
        });
    });
}

// execute in sequence
console.log("store");
genSalt(password)
.then(function(result) {
    return genHash(result.salt,result.password);
    })
.then(function(result) {
    console.log('store hash in user profile :', result);
    stored_hash = result.hash;
})
.catch(function(err) {
    console.log(err);
});

// =====================================================
function lookupUser(user,passwd) {
    return new Promise((resolve,reject) => {
        // lookup the user in the stored database
        // in this case its not async so just resolve with the stored hash
        resolve({
            user:user,
            password:passwd,
            hash1:stored_hash
        })
    })
}

function reHash(user,password,hash1) {
    let salt  = hash1.substr(0,30);
    return new Promise((resolve,reject) => {
        bcrypt.hash(password,salt,null,function(err,hash2) {
            if (err) {
                reject(err);
            }
            else {
                resolve({
                    user:user,
                    salt:salt,
                    password:password,
                    hash1:hash1, // stored hash
                    hash2:hash2  // generated hash
                });
            }
        });
    });
}

// lookup and verify
setTimeout(function() {
    console.log("verify");
    lookupUser("joe",password) 
    .then(function(result) {
        return reHash(result.user,result.password,result.hash1);
    })
    .then(function(result) {
        console.log(result.hash1);
        console.log(result.hash2);
        if (result.hash1 === result.hash2) {
            console.log('verified');
        }
        else {
            console.log('failed');
        }
    })
    .catch(function(err) {
        console.log(err);
    });
},1000);


以上是关于javascript 使用带有promises的bcrypt来散列密码,然后验证它的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 像 Java 8 上的“Promise.all”(可能带有 lambdas)

带有 Fetch 的 Javascript Promise 在 Stripe API 的实现中导致“未定义”

在 Javascript 中捕获 Promise.all() 的解决方案

JavaScript Promise 中的执行顺序是啥?

如何链接原生 Javascript Promise?

ES6 Promises