2012-12-07 15 views
5

Sto lavorando a un'applicazione Web legacy Spring MVC che utilizza un - dagli attuali standard - algoritmo di hashing inappropriato. Ora voglio migrare gradualmente tutti gli hash a bcrypt. La mia strategia è di alto livello:Come modificare l'algoritmo di hashing della password quando si utilizza la sicurezza di primavera?

  • nuovi hash sono generati con bcrypt di default
  • Quando un utente accede con successo in e ha ancora un hash legacy, l'applicazione sostituisce il vecchio hash con un nuovo hash bcrypt.

Qual è il modo più idiomatico di implementare questa strategia con Spring Security? Dovrei usare un filtro personalizzato o il mio su AccessDecisionManager o ...?

risposta

5

Probabilmente dovrete personalizzare il vostro AuthenticationProvider in quanto è qui che il la password viene effettivamente confrontata con i dati dell'utente e si dispone di tutte le informazioni necessarie a disposizione.

Nel metodo authenticate, è necessario caricare prima i dati utente. Quindi controlla la password fornita dall'utente sia con uno BCryptPasswordEncoder sia con quello precedente. Se nessuno dei due restituisce una corrispondenza, lanciare un numero BadCredentialsException.

Se l'utente si autentica correttamente (molto importante :-)) e la password è in formato legacy (il codificatore legacy corrisponde), chiameresti un altro codice per aggiornare i dati dell'account dell'utente e sostituisci l'hash precedente con un bcrypt uno. È inoltre possibile utilizzare BCryptPasswordEncoder per creare nuovi hash.

Se si desidera, è possibile rilevare in anticipo se l'hash memorizzato era già crittografato prima di effettuare i confronti. Le stringhe di Bcrypt hanno un formato abbastanza distinto.

Si noti inoltre che per rendere più difficile l'individuazione di nomi di account validi, è necessario provare a far sì che il metodo si comporti allo stesso modo sia quando esiste un nome utente fornito che quando non lo fa (in termini di tempo necessario). Quindi chiama gli encoder anche quando non hai dati utente per il nome utente fornito.

0

Credo che il modo migliore per farlo è quello di specificare la password per encoder provider di autenticazione qualche cosa come qui di seguito, per ulteriori informazioni, consultare doc

<authentication-manager> 
    <authentication-provider user-service-ref="userService"> 
     <password-encoder ref="passwordEncoder"> 
      <salt-source ref="saltSource" /> 
     </password-encoder> 
    </authentication-provider> 
</authentication-manager> 


<beans:bean  class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" 
    id="passwordEncoder" /> 

<beans:bean  class="org.springframework.security.authentication.dao.ReflectionSaltSource" 
    id="saltSource"> 
    <beans:property name="userPropertyToUse" value="userName" /> 
</beans:bean> 
+0

Questo non risponde affatto alla domanda. Si sta chiedendo come eseguire la migrazione di un'app esistente utilizzando un formato hash precedente a uno utilizzando bcrypt. –

Problemi correlati