Registratie met Spring Security - Wachtwoordcodering

Dit artikel maakt deel uit van een reeks: • Tutorial Spring Security Registration

• Het registratieproces met Spring Security

• Registratie - Activeer een nieuw account via e-mail

• Spring Security Registration - Verzend de verificatie-e-mail opnieuw

• Registratie met Spring Security - Wachtwoordcodering (huidig ​​artikel) • De registratie-API wordt RESTful

• Spring Security - Reset uw wachtwoord

• Registratie - Wachtwoordsterkte en regels

• Uw wachtwoord bijwerken

1. Overzicht

Dit artikel bespreekt een cruciaal onderdeel van het registratieproces - wachtwoordcodering - in principe het wachtwoord niet in platte tekst opslaan.

Er zijn een paar coderingsmechanismen die worden ondersteund door Spring Security - en voor het artikel, we zullen BCrypt gebruiken, omdat dit meestal de beste beschikbare oplossing is.

De meeste andere mechanismen, zoals de MD5PasswordEncoder en ShaPasswordEncoder gebruik zwakkere algoritmen en zijn nu verouderd.

2. Definieer de wachtwoord-encoder

We beginnen met het definiëren van de eenvoudige BCryptPasswordEncoder als een bean in onze configuratie:

@Bean public PasswordEncoder encoder () {retourneer nieuwe BCryptPasswordEncoder (); }

Oudere implementaties - zoals SHAPasswordEncoder - vereist dat de client een salt-waarde doorgeeft bij het coderen van het wachtwoord.

BCrypt echter zal intern een willekeurig zout genereren in plaats daarvan. Dit is belangrijk om te begrijpen, omdat het betekent dat elke oproep een ander resultaat zal hebben, en dus hoeven we het wachtwoord maar één keer te coderen.

Om deze willekeurige zoutgeneratie te laten werken, slaat BCrypt het zout op in de hashwaarde zelf. Bijvoorbeeld in de volgende hash-waarde:

$ 2a $ 10 $ ZLhnHxdpHETcxmtEStgpI. / Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

Er zijn drie velden gescheiden door $:

  1. De "2a" vertegenwoordigt de BCrypt-algoritme-versie
  2. De “10” vertegenwoordigt de kracht van het algoritme
  3. De "ZLhnHxdpHETcxmtEStgpI." een deel is eigenlijk het willekeurig gegenereerde zout. In feite zijn de eerste 22 tekens zout. Het resterende deel van het laatste veld is de feitelijke gehashte versie van de platte tekst

Houd er ook rekening mee dat de BCrypt algoritme genereert een string met een lengte van 60, dus we moeten ervoor zorgen dat het wachtwoord wordt opgeslagen in een kolom die het kan bevatten. Een veelgemaakte fout is om een ​​kolom met een andere lengte te maken en vervolgens een Ongeldige gebruikersnaam of wachtwoord fout op het moment van authenticatie.

3. Codeer het wachtwoord bij registratie

We zullen nu de Wachtwoord Encoder in onze Gebruikersservice om het wachtwoord te hashen tijdens het gebruikersregistratieproces:

Voorbeeld 3.1. - De UserService Hashes het wachtwoord

@Autowired privé PasswordEncoder wachtwoordEncoder; @Override public User registerNewUserAccount (UserDto accountDto) gooit EmailExistsException {if (emailExist (accountDto.getEmail ())) {throw nieuwe EmailExistsException ("Er is een account met dat e-mailadres:" + accountDto.getEmail ()); } Gebruiker gebruiker = nieuwe gebruiker (); user.setFirstName (accountDto.getFirstName ()); user.setLastName (accountDto.getLastName ()); user.setPassword (wachtwoordEncoder.encode (accountDto.getPassword ())); user.setEmail (accountDto.getEmail ()); user.setRole (nieuwe rol (Integer.valueOf (1), gebruiker)); return repository.save (gebruiker); }

4. Codeer het wachtwoord bij verificatie

Laten we nu de andere helft van dit proces afhandelen en het wachtwoord coderen wanneer de gebruiker zich verifieert.

Eerst moeten we de wachtwoord-encoder-bean die we eerder hebben gedefinieerd in onze authenticatieleverancier injecteren:

@Autowired privé UserDetailsService userDetailsService; @Bean openbaar DaoAuthenticationProvider authProvider () {DaoAuthenticationProvider authProvider = nieuwe DaoAuthenticationProvider (); authProvider.setUserDetailsService (userDetailsService); authProvider.setPasswordEncoder (encoder ()); retourneer authProvider; }

De beveiligingsconfiguratie is eenvoudig:

  • we injecteren onze implementatie van de service voor gebruikersgegevens
  • we definiëren een authenticatieleverancier die verwijst naar onze detailenservice
  • we schakelen ook de wachtwoord-encoder in

En tot slot moeten we verwijs naar deze authenticatieleverancier in onze security XML-configuratie:

Of, als u Java-configuratie gebruikt:

@Configuration @ComponentScan (basePackages = {"com.baeldung.security"}) @EnableWebSecurity openbare klasse SecSecurityConfig breidt WebSecurityConfigurerAdapter uit {@Override beschermde ongeldige configuratie (AuthenticationManagerBuilder auth) gooit Uitzondering {auth.authenticationProvider (auth.authenticationProvider); } ...}

5. Conclusie

Deze korte tutorial vervolgt de registratieserie door te laten zien hoe het wachtwoord correct in de database kan worden opgeslagen door gebruik te maken van de eenvoudige maar zeer krachtige BCrypt-implementatie.

De volledige implementatie van deze tutorial over Registratie met Spring Security is te vinden op GitHub.

De volgende » De registratie-API wordt RESTful « Vorige voorjaars-beveiligingsregistratie - Verzend de verificatie-e-mail opnieuw