nodejs中使用bcrypt加密

最近一直在做的这个前后交互的项目中用到了bcrypt加密,总结一下
我是在window操作系统下安装的
1.window下安装bcrypt必须先安装node-gyp

npm install --save node-gyp

2.安装bcryptjs

npm install --save  bcryptjs
使用bcrypt模块的两种方式:
sync同步方式:
var bcrypt = require('bcrypt');

router.post('/', checkNotLogin, function(req, res, next){
    let password = req.fields.password

    //生成salt的迭代次数
    const saltRounds = 10;
    //随机生成salt
    const salt = bcrypt.genSaltSync(saltRounds);
    //获取hash值
    var hash = bcrypt.hashSync(password, salt);

    password = hash;

    storeUInfo();

    function storeUInfo(){
        let user = {
            name: name,
            password: password,   
            gender: gender,
            avatar: avatar,
            bio: bio
        }

        UserModel.create(user)
            .then(function(result){
                user = result.ops[0]
                delete user.password
                res.redirect('/posts')
            })
            .catch(function(e){
                if(e.message.match('duplicate key')){
                    req.flash('error','用户名已被占用')
                    return res.redirect('/signup')
                }
                next(e)
            })
   } 


//POST /signin  用户登录
router.post('/', checkNotLogin, function(req, res, next){
    const password = req.fields.password

    UserModel.getUserByName(name)
    .then(function(user){
        //检查密码是否匹配
        const pwdMatchFlag =bcrypt.compareSync(password, user.password);
        if(pwdMatchFlag){
            ...
            res.redirect('/posts')   //匹配成功跳转到主页
        }else{
            ...
            return res.redirect('back') //匹配失败返回之前的页面
        }
    })
    .catch(next)
})
异步方式
var bcrypt = require('bcrypt');

//POST /signup用户注册
router.post('/', checkNotLogin, function(req, res, next){
    let password = req.fields.password 

    //生成加密密码
    const saltRounds = 10;
    bcrypt.genSalt(saltRounds, function(err, salt){
        bcrypt.hash(password,salt, function(err, hash){

        //异步生成密码需要将存储等操作放在其回调函数中进行
            password = hash;
            storeUInfo();
        })
    })
    //存储用户信息
    function storeUInfo(){
        let user = {
            name: name,
            password: password, 
            gender: gender,
            avatar: avatar,
            bio: bio
        }

        //用户信息写入数据库
        UserModel.create(user)
            .then(function(result){
                user = result.ops[0];
                delete user.password
                res.redirect('/posts')
            })
            .catch(function(e){
                if(e.message.match('duplicate key')){
                    req.flash('error','用户名已被占用')
                    return res.redirect('/signup')
                }
                next(e)
            })
} 


//POST /signin  用户登录
router.post('/', checkNotLogin, function(req, res, next){
    const password = req.fields.password

    UserModel.getUserByName(name)
    .then(function(user){
       //检查密码是否匹配
       bcrypt.compare(password, user.password,function(err,res){
           const pwdMatchFlag = res;
           tryLogin(pwdMatchFlag);
        })
        // 尝试登录
        function tryLogin(pwdMatchFlag){
            if(pwdMatchFlag){
                ...
                res.redirect('/posts')   //匹配成功跳转到主页
            }else{
                ...
                return res.redirect('back') //匹配失败返回之前的页面
            }
        }
    })
    .catch(next)
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值