• Publicidad

Manejo de contraseñas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Manejo de contraseñas

Notapor Negrazo » 2014-07-23 12:57 @581

Hola a todos.

Estoy manejando una aplicación en la cual, todo usuario debe registrarse para poder acceder sus datos y la aplicación en general.

Esto lo hago, como es clásico, con una clave de usuario y una contraseña. Ambos campos son char(10) y los guardo en una tabla de usuarios en MySQL.

El problema es que algunos usuarios más avanzados están pudiendo leer las contraseñas de otros usuarios y esto me puede traer problemas en un futuro.

Mi pregunta es si hay algún tipo de campo en especial para guardar contraseñas o si alguien conoce algún truco para guardarlos en una forma más segura.

Espero haber sido claro en mi explicación.

Gracias por adelantado.

Negrazo.
Negrazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 100
Registrado: 2006-12-28 12:51 @577
Ubicación: Guadalajara, Mexico

Publicidad

Re: Manejo de contraseñas

Notapor explorer » 2014-07-23 14:32 @647

Primero hay que ver de qué forma están accediendo a esas contraseñas.

¿Es accediendo directamente a la base de datos? Entonces el problema es a la hora de filtrar las entradas al programa, para impedir que hagan esas consultas.

¿Están leyendo las contraseñas desde el teclado del ordenador? Pueden haber instalado algún logger o programa espía en el ordenador, que vigila lo que se está escribiendo. Entonces hay que avisar al administrador del sistema para que ponga medidas.

Una buena forma para evitar que puedan leer la contraseña desde la base de datos es... no guardar la contraseña :)

Me explico: en lugar de guardar la contraseña, guardas el valor de PASSWORD(contraseña) (función MySQL) (el propio MySQL lo hace así). Entonces lo que se guarda es un valor hash que es complicado de sacar. Si alguien se hace con la base de datos, no verá las contraseñas.

Y en la aplicación, a la hora de comprobar la autenticación, te vale con comprobar si el contenido del campo es igual al valor de PASSWORD() de la contraseña que recibimos ( `username' == 'usuario' AND `password` == PASSWORD(contraseña) ).

El problema es... si el usuario pierde la contraseña o se le olvida. Pues no pasa nada: le damos una nueva y actualizamos el campo de la base de datos.

P.D.: los valores hash podrían sacarse por fuerza bruta, por eso cada vez se usan más bits. Una forma de dificultar aún más el procedimiento es la de ofuscar la contraseña ANTES de pasarla por PASSWORD(). Por ejemplo, si la contraseña del usuario es "contra", podemos convertirla en "tMraIcAoPnP" (hemos cambiado el orden de las letras de la contraseña y hemos agregado en posiciones fijas las letras "MIAPP". Y eso lo pasamos a PASSWORD(). Si alguien es capaz de sacar el valor original, le será más complicado saber el orden correcto de las letras y qué letras quitar :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Manejo de contraseñas

Notapor Negrazo » 2014-07-24 19:31 @855

Gracias, explorer, por tu respuesta.

A ver si entendí tu propuesta. En lugar del campo char(10) para contraseñas, voy a guardar PASSWORD(contraseña) ¿En dónde se graba dicho campo?

Lo voy a probar y te mantengo informado.

El asunto es que hay algunos reportes, supuestamente confidenciales, donde vienen las contraseñas de todos los usuarios y por allí se está colando la información. Si logro guardar el hash que tu mencionas, pues solo podrán ver caracteres medio raros y ya no habrá problemas.

Gracias nuevamente.
Negrazo.
Negrazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 100
Registrado: 2006-12-28 12:51 @577
Ubicación: Guadalajara, Mexico

Re: Manejo de contraseñas

Notapor explorer » 2014-07-24 20:00 @875

No, el campo debe seguir siendo de tipo char(). La longitud del campo depende lo que genere PASSWORD().

Luego, a la hora de hacer el INSERT o UPDATE, en lugar de poner la contraseña, se guarda el valor de PASSWORD().

Algo así (no probado):

UPDATE users SET password=PASSWORD(contraseña) WHERE `id`=identificador;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Manejo de contraseñas

Notapor danimera » 2014-07-25 20:13 @884

Pues yo recomiendo que... usaras un algoritmo tipo SHA o tipo MD5 para codificar la contraseña, ya que así pues también lo que guarda es un hash o el valor codificado...
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Manejo de contraseñas

Notapor explorer » 2014-07-25 22:41 @987

Si quieres usar los métodos SHA o MD5 como dice danimera, en MySQL tienes las funciones SHA2() y MD5(), como se comenta en la documentación de MySQL v5.5. Verás ahí que no recomiendan usar PASSWORD(), si no las otras funciones, por ser más seguras.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Manejo de contraseñas

Notapor Negrazo » 2014-07-26 13:12 @591

Gracias, Danimera y explorer.

Ya leí la información de SHA1 y SHA2 y creo que me voy a ir por este camino.

También leí en el Manual de Ref. de MySQL, que el método PASSWORD() lo utiliza el servidor de MySQL para controlar el acceso a sus bases de datos, pero que no lo recomiendan para usarlo en aplicaciones propias.

Saludos desde Guadalajara, México.
Negrazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 100
Registrado: 2006-12-28 12:51 @577
Ubicación: Guadalajara, Mexico


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron