使用bcrypt存储密码无效
Use bcrypt to store password takes no effect
我使用 mongodb 来存储我的用户 table,并使用 bcrypt 来存储密码。但是,存储的密码都是真实的文本。我的节点 js 代码如下:
var mongoose = require('mongoose')
var bcrypt = require('bcrypt')
var SALT_WORK_FACTOR = 10
var UserSchema = new mongoose.Schema({
name:{
type:String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
meta: {
createAt: {
type: Date,
default: Date.now()
},
updateAt: {
type: Date,
default: Date.now()
}
}
})
UserSchema.pre('save',function(next){
var user = this
if(this.isNew){
this.meta.createAt = this.meta.updateAt = Date.now()
}
else{
this.meta.updateAt = Date.now()
}
bcrypt.genSalt(SALT_WORK_FACTOR,function(err, salt){
if(err) return next(err)
console.log('salt'+salt)
bcrypt.hash(user.password, salt, function(err, hash){
console.log('hash'+hash)
if(err)
return next(err)
console.log('set user password' + hash)
user.password = hash
next()
})
})
next()
})
之后,我在我的 mongo 终端中使用 db.users.find() ,我看到的只是以真实文本存储的密码:
{ "_id" : ObjectId("54d2f5a4162a7335c0036cae"), "name" : "12", "password" : "12", "meta" : { "updateAt" : ISODate("2015-02-05T04:46:28.246Z"), "createAt" : ISODate("2015-02-05T04:46:28.246Z") }, "__v" : 0 }
{ "_id" : ObjectId("54d2f89c0675b329c3e783d4"), "name" : "34", "password" : "34", "meta" : { "updateAt" : ISODate("2015-02-05T04:59:08.285Z"), "createAt" : ISODate("2015-02-05T04:59:08.285Z") }, "__v" : 0 }
{ "_id" : ObjectId("54d2f9703b55cdf5c32af5b2"), "name" : "457", "password" : "457", "meta" : { "updateAt" : ISODate("2015-02-05T05:03:23.338Z"), "createAt" : ISODate("2015-02-05T05:03:23.338Z") }, "__v" : 0 }
因此,我的比较函数总是 return false:
UserSchema.methods = {
comparePassword: function(_password, cb){
bcrypt.compare(_password, this.password, function(err, isMatched){
if(err)
return cb(err)
cb(null, isMatched)
})
}
}
有人可以帮我解决这个问题吗?
我的猜测是,因为在调用 bcrypt.genSalt()
后立即有一个额外的 next()
,所以 user.password
的值在条目保存到数据库之前没有改变.因此,在 bcrypt.genSalt()
之后立即删除 next()
,它应该会按预期工作。
我使用 mongodb 来存储我的用户 table,并使用 bcrypt 来存储密码。但是,存储的密码都是真实的文本。我的节点 js 代码如下:
var mongoose = require('mongoose')
var bcrypt = require('bcrypt')
var SALT_WORK_FACTOR = 10
var UserSchema = new mongoose.Schema({
name:{
type:String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
meta: {
createAt: {
type: Date,
default: Date.now()
},
updateAt: {
type: Date,
default: Date.now()
}
}
})
UserSchema.pre('save',function(next){
var user = this
if(this.isNew){
this.meta.createAt = this.meta.updateAt = Date.now()
}
else{
this.meta.updateAt = Date.now()
}
bcrypt.genSalt(SALT_WORK_FACTOR,function(err, salt){
if(err) return next(err)
console.log('salt'+salt)
bcrypt.hash(user.password, salt, function(err, hash){
console.log('hash'+hash)
if(err)
return next(err)
console.log('set user password' + hash)
user.password = hash
next()
})
})
next()
})
之后,我在我的 mongo 终端中使用 db.users.find() ,我看到的只是以真实文本存储的密码:
{ "_id" : ObjectId("54d2f5a4162a7335c0036cae"), "name" : "12", "password" : "12", "meta" : { "updateAt" : ISODate("2015-02-05T04:46:28.246Z"), "createAt" : ISODate("2015-02-05T04:46:28.246Z") }, "__v" : 0 }
{ "_id" : ObjectId("54d2f89c0675b329c3e783d4"), "name" : "34", "password" : "34", "meta" : { "updateAt" : ISODate("2015-02-05T04:59:08.285Z"), "createAt" : ISODate("2015-02-05T04:59:08.285Z") }, "__v" : 0 }
{ "_id" : ObjectId("54d2f9703b55cdf5c32af5b2"), "name" : "457", "password" : "457", "meta" : { "updateAt" : ISODate("2015-02-05T05:03:23.338Z"), "createAt" : ISODate("2015-02-05T05:03:23.338Z") }, "__v" : 0 }
因此,我的比较函数总是 return false:
UserSchema.methods = {
comparePassword: function(_password, cb){
bcrypt.compare(_password, this.password, function(err, isMatched){
if(err)
return cb(err)
cb(null, isMatched)
})
}
}
有人可以帮我解决这个问题吗?
我的猜测是,因为在调用 bcrypt.genSalt()
后立即有一个额外的 next()
,所以 user.password
的值在条目保存到数据库之前没有改变.因此,在 bcrypt.genSalt()
之后立即删除 next()
,它应该会按预期工作。