Registrierung bei Spring Security - Passwortkodierung

Dieser Artikel ist Teil einer Reihe: • Spring Security Registration Tutorial

• Der Registrierungsprozess mit Spring Security

• Registrierung - Aktivieren Sie ein neues Konto per E-Mail

• Spring Security Registration - Bestätigungs-E-Mail erneut senden

• Registrierung bei Spring Security - Kennwortkodierung (aktueller Artikel) • Die Registrierungs-API wird RESTful

• Spring Security - Setzen Sie Ihr Passwort zurück

• Registrierung - Passwortstärke und Regeln

• Aktualisieren Sie Ihr Passwort

1. Übersicht

Dieser Artikel beschreibt einen kritischen Teil des Registrierungsprozesses - die Kennwortkodierung - und speichert das Kennwort grundsätzlich nicht im Klartext.

Es gibt einige von Spring Security unterstützte Codierungsmechanismen - und für den Artikel verwenden wir BCrypt , da dies normalerweise die beste verfügbare Lösung ist.

Die meisten anderen Mechanismen, wie der MD5PasswordEncoder und der ShaPasswordEncoder, verwenden schwächere Algorithmen und sind jetzt veraltet.

2. Definieren Sie den Passwort-Encoder

Zunächst definieren wir den einfachen BCryptPasswordEncoder als Bean in unserer Konfiguration:

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

Ältere Implementierungen - wie SHAPasswordEncoder - erfordern, dass der Client beim Codieren des Kennworts einen Salt-Wert übergibt .

BCrypt generiert jedoch stattdessen intern ein zufälliges Salz . Dies ist wichtig zu verstehen, da dies bedeutet, dass jeder Anruf ein anderes Ergebnis hat und wir das Kennwort daher nur einmal verschlüsseln müssen.

Damit diese zufällige Salzgenerierung funktioniert, speichert BCrypt das Salz im Hash-Wert. Zum Beispiel im folgenden Hashwert:

$2a$10$ZLhnHxdpHETcxmtEStgpI./Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

Es gibt drei durch $ getrennte Felder:

  1. Die "2a" repräsentiert die BCrypt-Algorithmusversion
  2. Die „10“ repräsentiert die Stärke des Algorithmus
  3. Das "ZLhnHxdpHETcxmtEStgpI". Teil ist eigentlich das zufällig erzeugte Salz. Grundsätzlich sind die ersten 22 Zeichen Salz. Der verbleibende Teil des letzten Feldes ist die tatsächliche Hash-Version des Klartextes

Beachten Sie auch, dass der BCrypt- Algorithmus eine Zeichenfolge mit der Länge 60 generiert. Daher müssen wir sicherstellen, dass das Kennwort in einer Spalte gespeichert wird, die es aufnehmen kann. Ein häufiger Fehler besteht darin, eine Spalte mit einer anderen Länge zu erstellen und dann bei der Authentifizierung einen ungültigen Benutzernamen- oder Kennwortfehler zu erhalten.

3. Codieren Sie das Passwort bei der Registrierung

Wir werden jetzt den PasswordEncoder in unserem UserService verwenden, um das Passwort während des Benutzerregistrierungsprozesses zu hashen :

Beispiel 3.1. - Der UserServic e hascht das Passwort

@Autowired private PasswordEncoder passwordEncoder; @Override public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException { if (emailExist(accountDto.getEmail())) { throw new EmailExistsException( "There is an account with that email adress:" + accountDto.getEmail()); } User user = new User(); user.setFirstName(accountDto.getFirstName()); user.setLastName(accountDto.getLastName()); user.setPassword(passwordEncoder.encode(accountDto.getPassword())); user.setEmail(accountDto.getEmail()); user.setRole(new Role(Integer.valueOf(1), user)); return repository.save(user); }

4. Codieren Sie das Passwort bei der Authentifizierung

Lassen Sie uns nun die andere Hälfte dieses Prozesses behandeln und das Kennwort verschlüsseln, wenn sich der Benutzer authentifiziert.

Zuerst müssen wir die zuvor definierte Passwort-Encoder-Bean in unseren Authentifizierungsanbieter einfügen:

@Autowired private UserDetailsService userDetailsService; @Bean public DaoAuthenticationProvider authProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); authProvider.setUserDetailsService(userDetailsService); authProvider.setPasswordEncoder(encoder()); return authProvider; }

Die Sicherheitskonfiguration ist einfach:

  • Wir führen unsere Implementierung des Benutzerdetailservices ein
  • Wir definieren einen Authentifizierungsanbieter, der auf unseren Detailservice verweist
  • Wir aktivieren auch den Passwort-Encoder

Und schließlich müssen wir diesen Authentifizierungsanbieter in unserer Sicherheits-XML-Konfiguration referenzieren :

Oder falls Sie eine Java-Konfiguration verwenden:

@Configuration @ComponentScan(basePackages = { "com.baeldung.security" }) @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authProvider()); } ... }

5. Schlussfolgerung

In diesem kurzen Tutorial wird die Registrierungsserie fortgesetzt, indem gezeigt wird, wie das Kennwort mithilfe der einfachen, aber sehr leistungsstarken BCrypt-Implementierung ordnungsgemäß in der Datenbank gespeichert wird.

Die vollständige Implementierung dieses Lernprogramms zur Registrierung mit Spring Security finden Sie auf GitHub.

Weiter » Die Registrierungs-API wird RESTful « Vorherige Sicherheitsregistrierung im Frühjahr - Bestätigungs-E-Mail erneut senden