Пример хеширования пароля Spring Security

Пример хеширования пароля Spring Security

В этом руководстве мы покажем вам, как использоватьBCryptPasswordEncoder для хеширования пароля и выполнения аутентификации при входе в Spring Security.

Раньше мы обычно использовали алгоритм хеширования MD5Md5PasswordEncoder или SHAShaPasswordEncoder для кодирования пароля ... вам все еще разрешено использовать любой кодировщик, который вам нравится, но Spring рекомендует использоватьBCrypt BCryptPasswordEncoder, более сильный алгоритм хеширования со случайно сгенерированной солью.

Используемые технологии:

  1. Весна 3.2.8. ВЫПУСК

  2. Spring Security 3.2.3.RELEASE

  3. Spring JDBC 3.2.3.RELEASE

  4. MySQL Server 5.6

1. Обзор PasswordEncoder

Знакомый старый интерфейс аутентификацииPasswordEncoder устарел…

package org.springframework.security.authentication.encoding;

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

Вместо этого вы должны использовать этот новый интерфейс шифрованияPasswordEncoder.

package org.springframework.security.crypto.password;

//Implementation : BCryptPasswordEncoder
public interface PasswordEncoder {

2. Генерация пароля BCrypt

Сначала хешируйте пароль и помещайте его в базу данных, чтобы позже авторизоваться при входе. В этом примереBCryptPasswordEncoder используется для хеширования пароля «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++;
    }

  }
}

В алгоритме хеширования BCrypt каждый раз генерируется другое значение хэша длины 60.

$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

Каждый раз, когда вы хешируете значение с помощью BCrypt, это нормально, поскольку соль генерируется случайным образом. В этом уроке мы получаем первый вывод и вставляем его в базу данных.

3. База данных

Создайте таблицы и вставьте пользовательский «пример» для тестирования.

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. Включить кодировщик паролей

Несколько способов включить кодировщик паролей в конфигурации 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. Проект Демо

Доступ к странице, защищенной паролем:localhost:8080/spring-security-password-hashing/admin, отображается страница входа. Введите пароль «123456», Spring Security хеширует пароль и сравнивает его с хешированным паролем из базы данных.

spring-security-password-encoder

Пользователь и пароль в базе данных.

spring-security-password-encoder-database

Скачать исходный код

Скачать -spring-security-password-hashing.zip (18 КБ)