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.
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é.
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:
ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
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 :)