Verificamos de forma cada noticias en nuestro sitio web con el objetivo de mostrarte en todo momento la información con la mayor veracidad y actualizada.
Solución:
Primero lea la respuesta de Steven Carlson sobre el hashing de contraseñas.
Lo bueno es que Spring Security lo hará por usted. Spring Security 3.2 introdujo el nuevo org.springframework.security.crypto.password.PasswordEncoder
interfaz y algunas implementaciones: BCryptPasswordEncoder
, StandardPasswordEncoder
(y NoOpPasswordEncoder
).
Importante: no confundir org.springframework.security.
crypto.password
.PasswordEncoder
con lo viejo en desuso org.springframework.security.
authentication.encoding
.PasswordEncoder
La interfaz (y por lo tanto las implementaciones) tiene los dos métodos que necesita:
public String encode(CharSequence rawPassword)
public boolean matches(CharSequence rawPassword, String encodedPassword)
recomiendo usar org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
. los BCryptPasswordEncoder
(en contraste con el StandardPasswordEncoder
) use una sal que sea diferente para cada contraseña (pero no global como la de StandardPasswordEncoder
). Cuando codifica una contraseña sin procesar (public String encode(CharSequence rawPassword)
), entonces la contraseña codificada devuelta no es solo la contraseña codificada, también contiene metainformación sobre el algoritmo hash utilizado, la sal utilizada y, por supuesto, la contraseña codificada.
No debe “cifrar” la contraseña en absoluto. Sé que esto suena contra-intuitivo. Pero no hay ninguna razón por la que su sistema deba descifrar la contraseña. Hacerlo abriría su base de datos a un pirata informático, porque si almacena su contraseña de descifrado en sus códigos/servidor, un pirata informático puede robar esa información.
El proceso correcto es hash
la contraseña. Un hash es un proceso unidireccional (no se puede descifrar al texto original). El estándar actual sería usar SHA256 para cifrar su contraseña. Aquí hay un diagrama de flujo básico:
- Tomar la contraseña enviada por el usuario. La contraseña de ejemplo “mypass” se convertiría en
ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
- Almacene este hash (
ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
) en su base de datos.
Cuando un usuario inicia sesión, toma la contraseña que acaba de enviar y la codifica. Si ingresa la misma contraseña, obtendrá el mismo valor en su base de datos.
Cuando un usuario va a cambiar las contraseñas, aplica el hash “ingrese su contraseña anterior” para verificar que la contraseña anterior aún coincida, si es así, aplica el hash “ingresa su nueva contraseña” y la guarda.
Una cosa que no mencioné en mi ejemplo es salt
. Esto es algo que debe usar en su sistema, ya que protege sus datos de rainbow table
explota Pero eso es para otra discusión.
Espero que esto ayude 🙂
Al final de todo puedes encontrar las críticas de otros usuarios, tú además eres capaz insertar el tuyo si lo crees conveniente.