关于javascript:使用Node.js和MongoDB存储密码

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