2012-12-07 3 views
5

Ich arbeite an einer Legacy-Spring-MVC-basierten Webanwendung, die einen - nach aktuellen Standards - unangemessenen Hashalgorithmus verwendet. Jetzt möchte ich schrittweise alle Hashes nach bcrypt migrieren. Meine hohe Strategie ist:Wie ändere ich den Passwort-Hashing-Algorithmus, wenn ich die Federsicherheit verwende?

  • Neue Hashes erzeugt mit bcrypt standardmäßig
  • Wenn ein Benutzer erfolgreich anmeldet und hat immer noch ein Vermächtnis Hash, der App, den alten Hash mit einem neuen bcrypt Hash ersetzt.

Was ist die idiomatische Art, diese Strategie mit Spring Security zu implementieren? Soll ich einen benutzerdefinierten Filter oder mein AccessDecisionManager verwenden oder ...?

Antwort

5

Sie werden wahrscheinlich Ihre AuthenticationProvider anpassen müssen, da das ist, wo die Das Passwort wird tatsächlich mit den Benutzerdaten verglichen und Sie haben alle benötigten Informationen verfügbar.

In der authenticate Methode würden Sie zuerst die Benutzerdaten laden. Überprüfen Sie dann das vom Benutzer angegebene Passwort sowohl mit BCryptPasswordEncoder als auch mit Ihrem alten Passwort. Wenn keiner von beiden ein Match zurückgibt, wirf einen BadCredentialsException.

Wenn sich der Benutzer erfolgreich authentifiziert (sehr wichtig :-)) und das Kennwort das Legacy-Format ist (der Legacy-Encoder angepasst), würden Sie dann zusätzlichen Code aufrufen, um die Kontodaten des Benutzers zu aktualisieren und den Legacy-Hash durch ein bcrypt zu ersetzen ein. Die BCryptPasswordEncoder kann auch verwendet werden, um neue Hashes zu erstellen.

Wenn Sie möchten, können Sie im Voraus erkennen, ob der gespeicherte Hash bereits vor dem Vergleich bcrypt war. Bcrypt-Strings haben ein ganz eigenes Format.

Beachten Sie auch, dass es, um das Erraten gültiger Kontonamen zu erschweren, versuchen sollte, dass sich die Methode sowohl bei vorhandenem als auch bei nicht vorhandenem Benutzernamen verhält. Rufen Sie daher die Encoder auf, auch wenn Sie keine Benutzerdaten für den angegebenen Benutzernamen haben.

0

denke ich, beste Weg, dies zu tun ist, wie unten einige Sache Passwort Encoder Authentifizierungsanbieter angeben, für weitere Informationen siehe 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

Dies beantwortet die Frage überhaupt nicht. Es wird gefragt, wie eine vorhandene App unter Verwendung eines Legacy-Hash-Formats in eine mit bcrypt übertragen wird. –

Verwandte Themen