Spring Security-Passwort-Hashing-Beispiel

Beispiel für das Hashing von Passwörtern für Spring Security

In diesem Tutorial zeigen wir Ihnen, wie SieBCryptPasswordEncoder verwenden, um ein Kennwort zu hashen und eine Anmeldeauthentifizierung in Spring Security durchzuführen.

Früher haben wir normalerweise den Hashing-Algorithmus von MD5Md5PasswordEncoder oder SHAShaPasswordEncoderverwendet, um ein Passwort zu codieren. Sie dürfen weiterhin einen beliebigen Encoder verwenden, Spring empfiehlt jedoch die Verwendung vonBCrypt BCryptPasswordEncoder, ein stärkerer Hashing-Algorithmus mit zufällig erzeugtem Salz.

Verwendete Technologien:

  1. Feder 3.2.8.FREIGABE

  2. Federsicherheit 3.2.3.FREIGABE

  3. Spring JDBC 3.2.3.RELEASE

  4. MySQL Server 5.6

1. Überprüfen Sie PasswordEncoder

Die bekannte alte AuthentifizierungsschnittstellePasswordEncoderist veraltet…

package org.springframework.security.authentication.encoding;

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

Stattdessen sollten Sie die Schnittstelle dieser neuen KryptoPasswordEncoderverwenden.

package org.springframework.security.crypto.password;

//Implementation : BCryptPasswordEncoder
public interface PasswordEncoder {

2. Erzeugen Sie ein BCrypt-Passwort

Hash ein Passwort und legen Sie es in eine Datenbank, um sich später zu authentifizieren. In diesem Beispiel wirdBCryptPasswordEncoder verwendet, um ein Kennwort "123456" zu hashen.

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++;
    }

  }
}

Beim BCrypt-Hashing-Algorithmus wird jedes Mal ein anderer Hash-Wert der Länge 60 generiert.

$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

Es ist normal, jedes Mal, wenn Sie mit BCrypt einen Wert hashen, einen anderen Wert zu erhalten, da Salz zufällig generiert wird. In diesem Tutorial erhalten wir die erste Ausgabe und fügen sie in die Datenbank ein.

3. Datenbank

Erstellen Sie Tabellen und fügen Sie ein Benutzer- "Beispiel" zum Testen ein.

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. Aktivieren Sie Password Encoder

Einige Möglichkeiten, um den Passwort-Encoder in der XML-Konfiguration zu aktivieren.

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. Projekt Demo

Zugriff auf eine passwortgeschützte Seite:localhost:8080/spring-security-password-hashing/admin, eine Anmeldeseite wird angezeigt. Geben Sie ein Passwort "123456" ein. Spring Security überprüft das Passwort und vergleicht es mit dem Passwort aus der Datenbank.

spring-security-password-encoder

Benutzer und Passwort in der Datenbank.

spring-security-password-encoder-database

Quellcode herunterladen

Herunterladen -spring-security-password-hashing.zip (18 KB)