Статьи

Spring Security с Spring Boot 2.0: кодировщик паролей

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

Реализация пользовательских данных может быть подкреплена механизмом в памяти, базой данных sql / no-sql и т. Д.
Варианты не ограничены.

На хранение паролей мы должны обратить внимание, это хэширование паролей.
В целях безопасности мы хотим хранить пароли в хешированном виде.
Предположим, кто-то получит несанкционированный доступ к таблице, хранящей наши пользовательские данные. Храня пароли в открытом виде, этот человек может восстановить пароль каждого пользователя в системе.

Поэтому мы хотим, чтобы наши пароли хешировались до их сохранения в базе данных.
Всегда помните, что ваше хеширование должно быть надежным и актуальным.
Например, MD5 был очень популярен в прошлом, но в настоящее время ведет к плохой безопасности. На самом деле, можно легко взломать пароли MD5, если вы используете GPU . Spring Encoder Spring

Spring Security предоставляет нам готовые функциональные возможности, когда дело доходит до кодирования паролей.
Кодировщик паролей — это интерфейс, который используется в процессе авторизации.

01
02
03
04
05
06
07
08
09
10
package org.springframework.security.crypto.password;
 
 
public interface PasswordEncoder {
 
    String encode(CharSequence rawPassword);
 
    boolean matches(CharSequence rawPassword, String encodedPassword);
 
}

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

Теперь Spring предоставляет нам различные реализации кодировщика паролей.
Давайте попробуем создать бин-кодировщик паролей.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.gkatzioura.security.passwordencoder.security;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.password.PasswordEncoder;
 
@Configuration
public class PasswordEncoderConfig {
 
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence rawPassword) {
                return rawPassword.toString();
            }
 
            @Override
            public boolean matches(CharSequence rawPassword, String encodedPassword) {
                return rawPassword.toString().equals(encodedPassword);
            }
        };
    }
}

Этот bean-компонент ничем не отличается от NoOpPasswordEncoder, который поставляется с весенней загрузкой.
Нет, мы собираемся провести небольшой эксперимент и добавить собственный кодировщик паролей.
Наш кодировщик паролей будет сравнивать открытый текстовый пароль, предоставленный пользователем, хэширующий его, и сравнивать его с уже хэшированным паролем от эквивалентного пользователя в нашей базе данных.

Для хеширования мы будем использовать bcrypt.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@Bean
    public PasswordEncoder customPasswordEncoder() {
 
        return new PasswordEncoder() {
 
            @Override
            public String encode(CharSequence rawPassword) {
 
                return BCrypt.hashpw(rawPassword.toString(), BCrypt.gensalt(4));
            }
 
            @Override
            public boolean matches(CharSequence rawPassword, String encodedPassword) {
 
                return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
            }
        };
    }

Чтобы проверить это, мы настроим нашу безопасность, используя переменные среды, как мы видели в предыдущем посте .

Сначала нам нужно закодировать наш пароль. Наша система не будет хранить пароль в виде открытого текста.

1
2
System.out.println(BCrypt.hashpw("user-password",BCrypt.gensalt(4)));
$2a$04$i4UWtMw6surai4dQMhoKSeLddi1XlAh2sSyG58K3ZvBHqVkhz8Y3y

Итак, что мы собираемся сделать дальше, это установить переменные среды перед запуском нашего весеннего загрузочного приложения.

1
2
SPRING_SECURITY_USER_NAME=test-user
SPRING_SECURITY_USER_PASSWORD=$2a$04$i4UWtMw6surai4dQMhoKSeLddi1XlAh2sSyG58K3ZvBHqVkhz8Y3y

Следующий шаг — перейти на экран входа в систему и указать учетные данные user-name и user-password.
Как вы можете видеть, вы только что были аутентифицированы.
За кулисами весна хэширует пароль, который вы отправили, и сравнивает его с существующим через переменные среды.

Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. См. Оригинальную статью здесь: Spring Security с Spring Boot 2.0: кодировщик паролей

Мнения, высказанные участниками Java Code Geeks, являются их собственными.