web-dev-qa-db-fra.com

Stockage des mots de passe avec Node.js et MongoDB

Je cherche des exemples de la façon de stocker en toute sécurité les mots de passe et autres données sensibles en utilisant node.js et mongodb.

Je veux que tout utilise un sel unique que je stockerai à côté du hachage dans le document mongo.

Pour l'authentification, dois-je simplement saler et chiffrer l'entrée et la faire correspondre à un hachage stocké?

Dois-je jamais avoir besoin de décrypter ces données et si oui, comment dois-je le faire?

Comment les clés privées ou même les méthodes de salage sont-elles stockées en toute sécurité sur le serveur?

J'ai entendu dire que l'AES et le Blowfish sont tous deux de bonnes options, que dois-je utiliser?

Tout exemple de la façon de concevoir cela serait merveilleusement utile!

Merci!

69
fancy

Utilisez ceci: https://github.com/ncb000gt/node.bcrypt.js/

bcrypt est l'un des quelques algorithmes axés sur ce cas d'utilisation. Vous ne devriez jamais être en mesure de décrypter vos mots de passe, vérifiez uniquement qu'un mot de passe en texte clair entré par l'utilisateur correspond au hachage stocké/crypté.

bcrypt est très simple à utiliser. Voici un extrait de mon schéma utilisateur Mongoose (en CoffeeScript). Assurez-vous d'utiliser les fonctions asynchrones car bycrypt est lent (exprès).

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

Lisez également cet article, qui devrait vous convaincre que bcrypt est un bon choix et vous éviter de devenir "bel et bien effed".

35
Peter Lyons

C'est le meilleur exemple que j'ai rencontré à ce jour, utilise node.bcrypt.js http://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt

13
chovy