web-dev-qa-db-fra.com

Encodage et décodage des mots de passe à l'aide de Spring Security, Spring Boot et MongoDB

J'utilise la pile de logiciels mentionnée ci-dessus et je dois crypter le mot de passe avant de l'enregistrer dans la base de données. J'ai également besoin de déchiffrer le mot de passe parce que lorsque quelqu'un change de mot de passe, il doit donner l'ancien mot de passe, puis le nouveau onw deux fois et je dois vérifier l'ancien mot de passe. J'ai beaucoup cherché mais je ne sais toujours pas quelle est la bonne façon de procéder. J'ai trouvé ce lien Chiffrement mais y a-t-il d'autres astuces pour le faire? Je ne sais pas non plus si peut-être MongoDB fournit quelque chose pour protéger les mots de passe.

8
quma

Première lecture réponse de Steven Carlson sur le hachage de mot de passe.

La bonne chose est que Spring Security le fera pour vous. Spring Security 3.2 a introduit la nouvelle interface org.springframework.security.crypto.password.PasswordEncoder et certaines implémentations: BCryptPasswordEncoder , StandardPasswordEncoder = (et NoOpPasswordEncoder).

Important: ne confondez pas org.springframework.security.crypto.password.PasswordEncoder Avec l'ancien obsolète org.springframework.security.authentication.encoding.PasswordEncoder

L'interface (et donc les implémentations) a les deux méthodes dont vous avez besoin:

  • public String encode(CharSequence rawPassword)
  • public boolean matches(CharSequence rawPassword, String encodedPassword)

Je recommande d'utiliser org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder . Le BCryptPasswordEncoder (contrairement au StandardPasswordEncoder) utilise un sel différent pour chaque mot de passe (mais pas global comme celui de StandardPasswordEncoder). Lorsque vous codez un mot de passe brut (public String encode(CharSequence rawPassword)), le mot de passe codé renvoyé n'est pas seulement le mot de passe codé, il contient également des métadonnées sur l'algorithme de hachage utilisé, le sel utilisé et bien sûr le mot de passe codé.

24
Ralph

Vous ne devriez pas du tout "crypter" le mot de passe. Je sais que cela semble contre-intuitif. Mais il n'y a aucune raison pour que votre système doive décrypter le mot de passe. Cela ouvrirait votre base de données à un pirate, car si vous stockez votre mot de passe de déchiffrement dans vos codes/serveurs, un pirate peut voler cette information.

Le processus correct consiste à hash le mot de passe. Un hachage est un processus à sens unique (ne peut pas être décrypté pour revenir au texte d'origine). La norme actuelle serait d'utiliser SHA256 pour hacher votre mot de passe. Voici un organigramme de base:

  1. Prenez le mot de passe soumis par l'utilisateur. Un exemple de mot de passe "mypass" serait haché vers ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
  2. Stockez ce hachage (ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222) dans votre base de données.

Lorsqu'un utilisateur se connecte, vous prenez le mot de passe qu'il vient de soumettre et le hachez. S'il entre le même mot de passe, il obtiendra la même valeur dans votre base de données.

Quand un utilisateur va changer les mots de passe, vous hachez le "entrez votre ancien mot de passe" pour vérifier que l'ancien mot de passe correspond toujours, si c'est le cas, vous hachez le "entrez votre nouveau mot de passe" et l'enregistrez.

Une chose que je n'ai pas mentionnée dans mon exemple est salt. C'est quelque chose que vous devez utiliser dans votre système car il protège vos données de Rainbow table exploits. Mais c'est pour une autre discussion.

J'espère que cela t'aides :)

20
Steven Carlson