Exemple de hachage du mot de passe Spring Security

Exemple de hachage de mot de passe Spring Security

Dans ce tutoriel, nous allons vous montrer comment utiliserBCryptPasswordEncoder pour hacher un mot de passe et effectuer une authentification de connexion dans Spring Security.

Dans l'ancien temps, normalement, nous utilisions l'algorithme de hachage MD5Md5PasswordEncoder ou SHAShaPasswordEncoder pour encoder un mot de passe ... vous êtes toujours autorisé à utiliser l'encodeur que vous voulez, mais Spring recommande d'utiliserBCrypt BCryptPasswordEncoder, un algorithme de hachage plus puissant avec du sel généré aléatoirement.

Technologies utilisées:

  1. Spring 3.2.8.RELEASE

  2. Spring Security 3.2.3.RELEASE

  3. Spring JDBC 3.2.3.RELEASE

  4. MySQL Server 5.6

1. Vérifier PasswordEncoder

L’ancienne interface d’authentificationPasswordEncoderest obsolète…

package org.springframework.security.authentication.encoding;

//Implementation : Md5PasswordEncoder and ShaPasswordEncoder
@Deprecated
public interface PasswordEncoder {

Au lieu de cela, vous devriez utiliser cette nouvelle interface cryptoPasswordEncoder.

package org.springframework.security.crypto.password;

//Implementation : BCryptPasswordEncoder
public interface PasswordEncoder {

2. Générer un mot de passe BCrypt

Tout d'abord, hachez un mot de passe et placez-le dans une base de données, pour une authentification de connexion plus tard. Cet exemple utiliseBCryptPasswordEncoder pour hacher un mot de passe «123456».

PasswordEncoderGenerator.java

package com.example.web.controller;

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

public class PasswordEncoderGenerator {

  public static void main(String[] args) {

    int i = 0;
    while (i < 10) {
        String password = "123456";
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String hashedPassword = passwordEncoder.encode(password);

        System.out.println(hashedPassword);
        i++;
    }

  }
}

Dans l'algorithme de hachage BCrypt, chaque fois, une valeur de hachage différente de longueur 60 est générée.

$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.
$2a$10$trT3.R/Nfey62eczbKEnueTcIbJXW.u1ffAo/XfyLpofwNDbEB86O
$2a$10$teJrCEnsxNT49ZpXU7n22O27aCGbVYYe/RG6/XxdWPJbOLZubLIi2
$2a$10$BHG59UT6p7bgT6U2fQ/9wOyTIdejh4Rk1vWilvl4b6ysNPdhnViUS
$2a$10$W9oRWeFmOT0bByL5fmAceucetmEYFg2yzq3e50mcu.CO7rUDb/poG
$2a$10$HApapHvDStTEwjjneMCvxuqUKVyycXZRfXMwjU0rRmaWMsjWQp/Zu
$2a$10$GYCkBzp2NlpGS/qjp5f6NOWHeF56ENAlHNuSssSJpE1MMYJevHBWO
$2a$10$gwbTCaIR/qE1uYhvEY6GG.bNDQcZuYQX9tkVwaK/aD7ZLPptC.7QC
$2a$10$5uKS72xK2ArGDgb2CwjYnOzQcOmB7CPxK6fz2MGcDBM9vJ4rUql36
$2a$10$6TajU85/gVrGUm5fv5Z8beVF37rlENohyLk3BEpZJFi6Av9JNkw9O

Il est normal d’obtenir une valeur différente chaque fois que vous hachez une valeur avec BCrypt, car le sel est généré de manière aléatoire. Dans ce didacticiel, nous obtenons la première sortie et l'insérons dans la base de données.

3. Base de données

Créez des tableaux et insérez un "exemple" utilisateur pour le test.

CREATE  TABLE users (
  username VARCHAR(45) NOT NULL ,
  password VARCHAR(60) NOT NULL ,
  enabled TINYINT NOT NULL DEFAULT 1 ,
  PRIMARY KEY (username));

CREATE TABLE user_roles (
  user_role_id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(45) NOT NULL,
  role varchar(45) NOT NULL,
  PRIMARY KEY (user_role_id),
  UNIQUE KEY uni_username_role (role,username),
  KEY fk_username_idx (username),
  CONSTRAINT fk_username FOREIGN KEY (username) REFERENCES users (username));

INSERT INTO users(username,password,enabled)
VALUES ('example','$2a$10$EblZqNptyYvcLm/VwDCVAuBjzZOI7khzdyGPBr08PpIi0na624b8.', true);

INSERT INTO user_roles (username, role)
VALUES ('example', 'ROLE_USER');
INSERT INTO user_roles (username, role)
VALUES ('example', 'ROLE_ADMIN');

4. Activer l'encodeur de mot de passe

Quelques façons d'activer l'encodeur de mot de passe dans la configuration XML.

4.1 Using the default BCryptPasswordEncoder.

spring-security.xml

  
    
        
    
  

4.2 Pass a "strength" parameter to the BCryptPasswordEncoder.

spring-security.xml

  
    
        
    
  

  
    
  

4.3 Pass an encoder to DaoAuthenticationProvider.

spring-security.xml

  
    
    
  

  

4.4 Annotation example.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth)
        throws Exception {

        auth.jdbcAuthentication().dataSource(dataSource)
            .passwordEncoder(passwordEncoder())
            .usersByUsernameQuery("sql...")
            .authoritiesByUsernameQuery("sql...");
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        return encoder;
    }

5. Démo du projet

Accéder à une page protégée par mot de passe:localhost:8080/spring-security-password-hashing/admin, une page de connexion s'affiche. Entrez un mot de passe "123456", Spring Security hachera le mot de passe et le comparera avec le mot de passe haché de la base de données.

spring-security-password-encoder

Utilisateur et mot de passe dans la base de données.

spring-security-password-encoder-database

Télécharger le code source

Télécharger -spring-security-password-hashing.zip (18 KB)