70 votes

Stockage des mots de passe avec Node.js et MongoDB

Je suis à la recherche de quelques exemples de la façon de placer stocker les mots de passe et autres données sensibles à l'aide de node.js et mondodb.

Je veux tout d'utiliser un unique sel que je stocke sur le côté de la valeur de hachage dans le mongo document.

Pour l'authentification je viens de sel et de chiffrer l'entrée et le faire correspondre à un hash stocké?

Dois-je toujours besoin de déchiffrer ces données et si oui, comment dois-je faire?

Comment sont les clés privées, ou même le salage des méthodes stockées de manière sécurisée sur le serveur?

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

Des exemples de la façon de concevoir ce serait merveilleusement utile!

Merci!

35voto

Peter Lyons Points 47794

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

bcrypt est l'un des quelques algorithmes concentré sur ce cas d'utilisation. Vous ne devriez jamais être en mesure de déchiffrer les mots de passe, seulement de vérifier que l'utilisateur est entré en texte clair le mot de passe correspond à la stockées/hachage chiffré.

bcrypt est très simple à utiliser. Voici un extrait de mon Mangouste Utilisateur de schéma (en CoffeeScript). Assurez-vous d'utiliser l'async fonctions comme bycrypt est lente (sur le but).

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 aider à éviter de devenir "vraiment bien et effed".

13voto

chovy Points 8012

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X