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

Storing passwords with Node.js and MongoDB

我正在寻找一些如何使用node.js和mongodb安全存储密码和其他敏感数据的示例。

我希望所有的东西都使用一种独特的盐,我将把它存储在mongo文档的散列旁边。

对于身份验证,我是否需要对输入进行salt和加密,并将其与存储的哈希匹配?

我需要解密这些数据吗?如果需要,我该怎么做?

如何在服务器上安全地存储私钥,甚至是salting方法?

我听说AES和河豚都是不错的选择,我应该用什么?

任何关于如何设计这个的例子都会非常有用!

谢谢!

  • 在数据库中存储密码的首选方法可能重复
  • github.com/bnoguchi/mongoose-auth?


使用: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是一个很好的选择,并帮助你避免变得"好的和真正的效果"。

  • 正如文章所指出的,我不完全相信我会相信使用bcrypt的逻辑,因为它很慢。没有理由你不能使用一个更"标准"和广泛使用的算法,比如sha-256,只需要在你的系统上施加人工延迟。在服务器实际检查传入的哈希之前,只需等待四分之一秒。有些系统还强制用户锁定(或降低权限)协议,如果他们在Y小时内的X次密码错误。这有一定的行李,但这是一个可以考虑的选项。
  • 你错过了要点。关键是,如果攻击者窃取了您的密码散列数据库,那么对于攻击者来说,bcrypt在其系统上运行速度很慢,而且无法解决这一问题,因为工作因素内置于算法本身。sha-256加上人工延迟是a)使用通用散列算法和b)不保护您免受离线破解被盗密码散列。
  • 是的,在攻击者实际上能够获得所有密码散列的副本的情况下,在bcrypt下破解密码散列会比较困难。这篇文章没有特别提到这个案例,但它可能应该提到。


这是迄今为止我遇到的最好的例子,使用node.bcrypt.jshttp://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt