2016-02-06 15 views
5

Uso lo stack di software menzioni sopra e ho bisogno di crittografare la password prima di salvarla nel database. Devo anche decifrare la password perché quando qualcuno cambia password, deve dargli la vecchia password e poi la nuova onw due volte e ho bisogno di controllare la vecchia password. Ho cercato molto ma non sono ancora sicuro di quale sia il modo giusto per farlo. Ho trovato questo link Encrypting ma ci sono altri suggerimenti per farlo? Inoltre non sono sicuro se MongoDB fornisca qualcosa per proteggere le password.Codifica e decodifica password utilizzando Spring Security, Spring Boot e MongoDB

risposta

18

Prima leggi Steven Carlson´s answer circa la password hashing.

La cosa buona è che Spring Security farà questo per voi. Spring Security 3.2 ha introdotto la nuova interfaccia org.springframework.security.crypto.password.PasswordEncoder e alcune implementazioni: BCryptPasswordEncoder, StandardPasswordEncoder (e NoOpPasswordEncoder).

Importante: Non confondere org.springframework.security.crypto.password.PasswordEncoder con il vecchio deprecato org.springframework.security.authentication.encoding.PasswordEncoder

L'interfaccia (e quindi le implementazioni) presenta i due metodi è necessario:

  • public String encode(CharSequence rawPassword)
  • public boolean matches(CharSequence rawPassword, String encodedPassword)

Si consiglia di utilizzare org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder. Il BCryptPasswordEncoder (a differenza di StandardPasswordEncoder) utilizza un valore di sale diverso per ciascuna password (ma non globale come quello da StandardPasswordEncoder). Quando si codifica una password non elaborata (public String encode(CharSequence rawPassword)), la password codificata restituita non è solo la password codificata, ma contiene anche alcune informazioni meta sull'algoritmo hash utilizzato, il sale utilizzato e, naturalmente, la password codificata.

+0

Grazie per aver aggiunto le informazioni di primavera perché non ho familiarità con quel prodotto :) –

+0

Come posso recuperare le meta informazioni come hai menzionato, ad esempio il sale usato? – charle819

+0

In caso di 'BCryptPasswordEncoder', la meta informazione è solo salt: Date un'occhiata a' BCrypt.hashpw (String password, String salt '). Il parametro chiamato 'salt' è la vecchia password criptata. E il codice in quel metodo "legge" il sale dalla password – Ralph

16

Non si deve assolutamente "crittografare" la password. So che questo sembra contro-intuitivo. Ma non vi è alcun motivo per cui il sistema debba essere necessario per decrittografare la password. Per fare ciò aprirebbe il tuo database a un hacker, perché se memorizzi la tua password di decrittografia nei tuoi codici/server un hacker può rubare quelle informazioni.

Il processo corretto è hash la password. Un hash è un processo a senso unico (non può essere decifrato al testo originale). Lo standard corrente sarebbe quello di utilizzare SHA256 per hash la tua password. Ecco un diagramma di flusso di base:

  1. Prendere la password inviata dall'utente. Esempio password "mypass" sarebbe hash a ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
  2. Memorizza questo hash (ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222) nel tuo database.

Quando un utente effettua il login, prende la password che ha appena inviato e lo ha cancellato. Se inserisce la stessa password, si ritrasferirà allo stesso valore nel database.

Quando un utente va a cambiare le password, si hash "inserisci la tua vecchia password" per verificare che la vecchia password corrisponda ancora, se invece hai hash "inserisci la tua nuova password" e salvala.

Una cosa che non ho menzionato nel mio esempio è salt. Questo è qualcosa che devi usare nel tuo sistema in quanto protegge i tuoi dati dagli exploit rainbow table. Ma questo è per un'altra discussione.

Spero che questo aiuti :)

Problemi correlati