MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Chiffrer les champs de mot de passe dans mongodb

D'après la conversation dans les commentaires, ce que vous voulez dire, c'est le hachage mots de passe, non chiffrés mots de passe. Vous feriez généralement cela avec un sel pour empêcher une attaque de table arc-en-ciel. Le stockage des mots de passe sous forme de hachages salés est la meilleure pratique standard lorsqu'il s'agit de stocker des mots de passe dans des bases de données.

Depuis la version 3.2, MongoDB n'a pas de support natif pour le hachage de mot de passe comme certaines bases de données SQL le fournissent, vous devrez donc l'implémenter en Java.

Pour générer un nouveau compte ou modifier le mot de passe d'un compte existant :

  1. générer une valeur de sel aléatoire cryptographiquement sécurisée avec java.security.SecureRandom . Cette classe fonctionne exactement comme le générateur de nombres aléatoires standard java.util.Random (il s'agit d'une sous-classe) mais échange les performances contre un niveau de non-prévisibilité beaucoup plus élevé, ce qui est requis pour un contexte lié à la sécurité.
  2. Créer une chaîne en concaténant sel et mot de passe
  3. Générez un hachage de cette chaîne avec une fonction de hachage cryptographiquement sécurisée. Il existe de nombreuses fonctions de hachage fournies par Java prêtes à l'emploi, mais vous souhaitez en utiliser une qui est intentionnellement difficile à calculer pour ralentir un attaquant ayant accès à la base de données essayant de forcer brutalement vos hachages sur leur cluster de supercalculateurs local. Un bon candidat est l'algorithme "PBKDF2WithHmacSHA1" qui est supporté par javax.crypto.SecretKeyFactory classe.
  4. Enregistrer le document dans MongoDB avec les champs username , password_hash et password_salt (plus vos données d'application réelles, bien sûr). N'enregistrez pas le mot de passe d'origine.

Pour récupérer un compte :

  1. Lire le username_input et password_input l'utilisateur présumé a saisi votre formulaire de connexion.
  2. Récupérer le document où le username correspond à username_input l'utilisateur a fourni.
  3. Obtenez le password_salt champ de ce document
  4. Créer une chaîne en concaténant password_salt et password_input comme vous l'avez fait avant.
  5. Générez un hachage de cette chaîne avec la même fonction de hachage cryptographiquement sécurisée.
  6. Comparer le hachage avec le password_hash champ du document. Lorsqu'il correspond, l'utilisateur a saisi le bon mot de passe.

Vous pouvez également récupérer uniquement les champs password_hash et password_salt du document et ne pas charger le reste avant que l'utilisateur ne soit authentifié, mais je suppose que dans le monde réel, cela entraînera plus de charge qu'il n'en économiserait. Les connexions réussies seront généralement beaucoup plus nombreuses que celles qui échouent, à moins que vous n'ayez un attaquant qui essaie de forcer brutalement un compte. Et dans ce cas, vous bloqueriez l'attaquant avec fail2ban ou un autre mécanisme de limitation de connexion.