Codificar y verificar las contraseñas para el inicio de sesión de los usuarios de la web

Traducido automáticamente de Deepl

La seguridad se está convirtiendo en un tema cada vez más importante a medida que las aplicaciones de negocio se vuelven más frecuentemente accesibles a través de la web y son, como resultado, más vulnerables a las amenazas. Como 4D presta mucha atención a las cuestiones de seguridad, en 4D v16 R5 le ofrecemos un par de mejoras de seguridad, y una de ellas está relacionada con la protección de las contraseñas de los usuarios de la web a través del hashing de contraseñas.

Por cierto, si quiere saber más sobre cómo 4D le ayuda a proteger sus datos y con la seguridad en general, le recomiendo que eche un vistazo a esta entrada del blog.

¿Por qué las contraseñas deben tener hash?

Tomemos un ejemplo concreto – usted tiene una aplicación de negocios, con usuarios que pueden iniciar sesión introduciendo su nombre y contraseña en un diálogo. Una vez iniciada la sesión, los usuarios adquieren «derechos adicionales», como leer y escribir en otras tablas o campos (por ejemplo, el departamento de Recursos Humanos puede acceder a la tabla de salarios de los empleados, pero no a los propios empleados).

A continuación, el servidor debe almacenar «algo» que sirva para verificar las contraseñas de los usuarios. El «algo» más básico consiste en las propias contraseñas. Cualquier contraseña no segura guardada en su base de datos podría ser robada y utilizada para comprometer su aplicación y sus datos. Si haces un hash de las contraseñas de tus usuarios antes de guardarlas en tu base de datos, la contraseña original no podrá ser encontrada o descifrada. Sin embargo, puedes comparar el hash con la contraseña original para comprobar su validez.

¿Hash o cifrado?

Lo primero que hay que tener en cuenta es que hay mucha gente que habla de contraseñas encriptadas pero en realidad se refiere a contraseñas con hash.

El cifrado utiliza un algoritmo para codificar los datos que pueden ser descifrados mediante una clave para recuperar los datos originales. En el hashing, una vez codificados los datos, no hay forma de recuperar los datos originales. Por lo tanto, las contraseñas deben ser sometidas a hashing y no encriptadas.

Una consecuencia del hashing de contraseñas es que, como no almacenas las contraseñas en sí (sino sólo un dato que basta para verificar una contraseña sin poder recuperarla), no puedes devolver las contraseñas a los usuarios que las hayan olvidado. En su lugar, debe seleccionar una nueva contraseña aleatoria para ellos, o dejar que ellos elijan una nueva contraseña.

¿Qué algoritmo para el hashing?

Los algoritmos como MD5 o SHA son muy rápidos, pero son vulnerables a los ataques de fuerza bruta. El algoritmo bcrypt es lento por diseño, pretende ser lento, por lo que es perfecto para el hash de contraseñas. Para más información, te aconsejo que leas el artículo «Cómo almacenar una contraseña de forma segura» de Coda Hale.

Comandos para hacer hash de contraseñas

Se han creado dos nuevos comandos para generar y verificar una contraseña con hash. Estos comandos se basan en el algoritmo bcrypt.

  • Un nuevo usuario crea su cuenta con la contraseña:«miContraseña«. Genero el hash de la contraseña con el comando new Generate password hash y luego guardo el hash de la contraseña en la base de datos.

$varHash:=Generate password hash("miContraseña")
[Usuario]Login:=$varLogin
[Usuario]HashPassword:=$varHash

SAVE RECORD ([Usuario]
)

  • Cuando mi usuario intenta conectarse, introduce su contraseña. Entonces compruebo la validez entre la contraseña introducida por el usuario y la contraseña hash guardada en la base de datos con el comando new Verify password hash comando.

C_TEXT($varLogin;$varPassword) // information entered by user
QUERY ([Usuario];[Usuario]Login;=;$varLogin)
If (Records in selection([Usuario])=1)

// Compare the password to the hash password
If (Verify password hash($varPassword;[Usuario]HashPassword))
SendToUser("Estás conectado. Bienvenido "+$varLogin+".")
Else
SendToUser("Ha introducido una contraseña incorrecta.")
End if

Else
SendToUser("Ha introducido un login incorrecto.")
End if

Vanessa Talbot
• Propietario de producto - Vanessa Talbot llegó al equipo de 4D Program en junio de 2014. Como Propietario de producto, está a cargo de escribir las historias de los usuarios y luego traducirlas a especificaciones funcionales. Su papel es también asegurarse de que la implementación de la funcionalidad entregada cumpla con las necesidades del cliente. Desde su llegada, ha trabajado en la definición de funcionalidades claves en 4D. Ha trabajado en la mayoría de las nuevas funcionalidades de multi hilo apropiativo y también en un tema muy complejo: la nueva arquitectura para la aplicación engined. Vanessa es licenciada por Telecom Saint-Etienne. Comenzó su carrera en el Instituto de Investigación Criminal como desarrolladora del departamento audiovisual. También ha trabajado en medios de comunicación y en el ámbito médico como experta en soporte técnico, producción y documentación de nuevas funcionalidades.