Storing passwords with Node.js and MongoDB
我正在寻找一些如何使用node.js和mongodb安全存储密码和其他敏感数据的示例。
我希望所有的东西都使用一种独特的盐,我将把它存储在mongo文档的散列旁边。
对于身份验证,我是否需要对输入进行salt和加密,并将其与存储的哈希匹配?
我需要解密这些数据吗?如果需要,我该怎么做?
如何在服务器上安全地存储私钥,甚至是salting方法?
我听说AES和河豚都是不错的选择,我应该用什么?
任何关于如何设计这个的例子都会非常有用!
谢谢!
使用:https://github.com/ncb000gt/node.bcrypt.js/
Bcrypt是关注这个用例的少数算法之一。您永远不能解密密码,只需验证用户输入的明文密码是否与存储/加密的哈希匹配。
bcrypt非常容易使用。这是我的Mongoose用户模式(在CoffeeScript中)中的一个片段。确保使用异步函数,因为bycrypt速度慢(故意)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class User extends SharedUser defaults: _.extend {domainId: null}, SharedUser::defaults #Irrelevant bits trimmed... password: (cleartext, confirm, callback) -> errorInfo = new errors.InvalidData() if cleartext != confirm errorInfo.message = 'please type the same password twice' errorInfo.errors.confirmPassword = 'must match the password' return callback errorInfo message = min4 cleartext if message errorInfo.message = message errorInfo.errors.password = message return callback errorInfo self = this bcrypt.gen_salt 10, (error, salt)-> if error errorInfo = new errors.InternalError error.message return callback errorInfo bcrypt.encrypt cleartext, salt, (error, hash)-> if error errorInfo = new errors.InternalError error.message return callback errorInfo self.attributes.bcryptedPassword = hash return callback() verifyPassword: (cleartext, callback) -> bcrypt.compare cleartext, @attributes.bcryptedPassword, (error, result)-> if error return callback(new errors.InternalError(error.message)) callback null, result |
另外,阅读这篇文章,它应该让你相信BCRYPT是一个很好的选择,并帮助你避免变得"好的和真正的效果"。
这是迄今为止我遇到的最好的例子,使用node.bcrypt.jshttp://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt