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 :
Générer le hash.
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é.
encodé
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 $ :
Il faut :
Il ne faut pas :
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 :
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"); } }
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 !