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 :
- 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 standardjava.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é. - Créer une chaîne en concaténant sel et mot de passe
- 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. - Enregistrer le document dans MongoDB avec les champs
username
,password_hash
etpassword_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 :
- Lire le
username_input
etpassword_input
l'utilisateur présumé a saisi votre formulaire de connexion. - Récupérer le document où le
username
correspond àusername_input
l'utilisateur a fourni. - Obtenez le
password_salt
champ de ce document - Créer une chaîne en concaténant
password_salt
etpassword_input
comme vous l'avez fait avant. - Générez un hachage de cette chaîne avec la même fonction de hachage cryptographiquement sécurisée.
- 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.