使用Node.js和MongoDB存储密码

71

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

我希望所有内容都使用唯一的盐来与哈希值一起存储在mongo文档中。

对于身份验证,我只需要对输入进行盐值处理和加密,然后将其与存储的哈希值匹配吗?

我是否需要解密这些数据,如果需要,应该如何解密?

私钥或者盐值处理方法是如何安全地存储在服务器上的?

我听说AES和Blowfish都是不错的选择,我应该使用哪一个?

任何关于设计这个功能的示例将非常有帮助!

谢谢!


可能是重复的问题:在数据库中存储密码的首选方法 - Thilo
https://github.com/bnoguchi/mongoose-auth/? - Alfred
2个回答

35

使用这个:https://github.com/ncb000gt/node.bcrypt.js/

bcrypt是少数专注于此用途的算法之一。您永远不应该能够解密密码,只能验证用户输入的明文密码是否与存储/加密哈希匹配。

bcrypt非常简单易用。以下是我的Mongoose用户模式代码片段(使用CoffeeScript)。请务必使用异步函数,因为bycrypt故意变慢。

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是一个好选择,并帮助你避免“彻底地失败”。


1
我并不完全确定是否应该像文章中所述那样,仅仅因为bcrypt很慢就使用它的逻辑。你完全可以使用更加“标准”和广泛使用的算法,比如SHA-256,并在系统上强制实施人工延迟。只需在服务器实际检查传入哈希之前等待四分之一秒即可。有些系统还会在x次密码错误的情况下在y小时内实施用户锁定(或降低权限)协议。这带来了某些负面影响,但这是一个值得考虑的选项。 - d512
20
你误解了重点。关键是,如果攻击者窃取了你的密码哈希数据库,bcrypt 算法会使攻击者在其系统上运行缓慢,并且这是无法避免的,因为工作因素已经嵌入到算法本身。使用SHA-256再加上人造延迟既 A)使用通用哈希算法 B)不能保护你的被盗密码哈希值免受离线破解。 - Peter Lyons
是的,在攻击者实际上能够获得所有密码哈希值的情况下,他们在bcrypt下破解这些哈希值会更加困难。该文章没有特别提到这种情况,但可能应该提一下。 - d512

13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接