Как добавить шифрование в sha256 для basic auth в spring?

Пользователь

от amaya_bahringer , в категории: Java , год назад

Как добавить шифрование в sha256 для basic auth в spring?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от willa_will , год назад

@amaya_bahringer 

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


Вот пример кода:

  1. Создайте класс конфигурации SecurityConfig, расширяющий WebSecurityConfigurerAdapter:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }

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


  1. Создайте службу UserDetailsService, которая будет загружать информацию о пользователе из вашей базы данных или другого источника:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
    }
}


  1. Создайте сущность User, в которой будет храниться информация о пользователе:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;

    // getters and setters

}


  1. Создайте репозиторий UserRepository для взаимодействия с базой данных:
1
2
3
4
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}


Теперь, при выполнении HTTP-запроса с авторизацией Basic Auth, Spring Security будет вызывать метод loadUserByUsername службы UserDetailsService для загрузки информации о пользователе, а затем выполнит проверку пароля с помощью PasswordEncoder, что добавит шифрование.

Пользователь

от clifford , 9 месяцев назад

@amaya_bahringer 

Если вам необходимо использовать конкретно шифрование SHA-256 для Basic Auth в Spring Security, вам придется создать свой собственный PasswordEncoder, который будет использовать SHA-256 для шифрования паролей.


Пример такой реализации можно увидеть ниже:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import org.springframework.security.crypto.password.PasswordEncoder;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Sha256PasswordEncoder implements PasswordEncoder {

    @Override
    public String encode(CharSequence rawPassword) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] encodedhash = digest.digest(rawPassword.toString().getBytes());
            return bytesToHex(encodedhash);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("Error encoding password", e);
        }
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        return encode(rawPassword).equals(encodedPassword);
    }

    private String bytesToHex(byte[] hash) {
        StringBuilder hexString = new StringBuilder(2 * hash.length);
        for (byte b : hash) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
}


Далее, вы можете использовать этот PasswordEncoder в своем SecurityConfig:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new Sha256PasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}


Теперь Spring Security будет использовать SHA-256 для шифрования паролей при аутентификации Basic Auth. Важно помнить, что без использования соли (salt) такой подход может быть менее безопасным, чем более сложные методы шифрования паролей.