Aller au contenu

Découverte de l’API Spring pour crypter les mots de passe

Comment ajouter l’API BCrypt de Spring dans votre projet java ?

Avec Gradle, il suffit d’ajouter la ligne ci-dessous :

// https://mvnrepository.com/artifact/org.springframework.security/spring-security-crypto
compile group: 'org.springframework.security', name: 'spring-security-crypto', version: '5.2.0.RELEASE'

Sinon, récupérer le fichier JAR et ajoutez-le à votre bibliothèque.

Documentation associée :

https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/crypto/bcrypt/BCrypt.html

Bcrypt utilise un grain de sel interne, comment cela marche ?

Basiquement, l’algorithme fonctionne ainsi :

Le hash est la concétanation du cout, du grain de sel et du mot de passe encodé. Quand quelqu’un essaye de se connecter, on récupére son mot de passe hashé pour connaître le grain de sel et le coût utilisé.

Ensuite, on génère un hash de la même manière. Si le hash est identique, le mot de passe est bon !

Un hash bcrypt ressemble à cela :

$2a$10$zlUbNqxdwQIL6dCcQEfLzeSZdstkbCyFCdQo/KmA31PXxkG8U66SS

3 zones sont séparées par le symbole dollar $ :

Conseils pour la gestion du mot de passe

Il faut :

Il ne faut pas :

Objectif : Hasher le mot de passe

Eviter les accès frauduleux aux comptes des utilisateurs en cas de faille de sécurité. L’objectif étant que cela soit le plus difficile possible pour une un hacker de décoder les mots de passe.

Exemple :

Utilisation avec Java de BCrypt de Spring

Définir une variable de Hashage par défaut :

private static final String HASH = BCrypt.gensalt(10);

Méthode pour encoder :

import org.springframework.security.crypto.bcrypt.BCrypt;
public static void encoder(String mdp)
	{
		// hashage du mot de passe
		String mdpHash =BCrypt.hashpw( mdp, ControleurConnexion.HASH );
		System.out.println("Mot de passe avec Hashage = "+ mdpHash);
		 
	}

Méthode pour comparer et décoder :

import org.springframework.security.crypto.bcrypt.BCrypt;
public static void decoder(String mdp, String mdpHash) {
		
        // comparer le mot de passe en clair avec le mot de passe encodé
		if( BCrypt.checkpw(mdp, mdpHash) ) {
		    System.out.println("OK");
		}else {
		    System.out.println("KO");
		}
	}

Utilisation avec BCrypt de Spring

Avec l’API de Spring on peut aussi écrire ce genre de code plus simple :


import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public static void test() {
			String password = "TotoEstMonMotDePasse!";
			
			// encoder
			BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
			String hashedPassword = passwordEncoder.encode(password);

			System.out.println("password encoder = "+ hashedPassword);
			
			// comparer 
			
			BCryptPasswordEncoder passdecoder = new BCryptPasswordEncoder();
			if (passdecoder.matches(password, hashedPassword))
				{
				 System.out.println("mot de passe OKOKOK");
				}
			else {
				System.out.println("mot de passe KOKOKO");
			}
		}

Pour l’intégration dans votre code, à vous de jouer !