Asunto: Cómo guardar contraseñas en una BD de forma segura
Estoy utilizando MySQL (Base de datos) y Delphi (lenguaje de programación). Tengo una tabla con los usuarios para el inicio de sesión en la aplicación. Me gustaría poder guardar las contraseñas de estos usuarios de forma segura en la tabla, de forma que si algún usuario accede a la tabla directamente no pueda ver las contraseñas de otros usuarios. Algo así como guardarlas encriptadas o algo.
¿existe alguna forma de encriptar las contraseñas mediante alguna función de MySQL?
Publicado:
Mar Jun 26, 2007 8:44 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Cómo guardar contraseñas en una BD de forma segura
Anuncios
varios escribió:
Estoy utilizando MySQL (Base de datos) y Delphi (lenguaje de programación). Tengo una tabla con los usuarios para el inicio de sesión en la aplicación. Me gustaría poder guardar las contraseñas de estos usuarios de forma segura en la tabla, de forma que si algún usuario accede a la tabla directamente no pueda ver las contraseñas de otros usuarios. Algo así como guardarlas encriptadas o algo.
¿existe alguna forma de encriptar las contraseñas mediante alguna función de MySQL?
MySQL tiene varias funciones para este menester, puedes utilizar:
* PASSWORD (): aunque no es recomendable porque utiliza un algoritmo de encriptación simple
* SHA-1(): utiliza el algoritmo de encriptación SHA-1 160-bit.
* MD5(): utliza el algoritmo de encriptación MD5 128-bit. Calcula el HASH de la cadena de texto que se le pase como parámetro.
Un ejemplo de uso de alguna de estas funciones:
Código:
select md5('contraseña_encriptada')
from dual
devolverá: df5c9278585e5a37fdebde0e91eff4f3
Con lo cual, una forma de guardar las contraseñas de manera "segura" (como todo, no al 100%, pues estos algoritmos ya han sido rotos en varias ocasiones) sería la siguiente:
1. Al usuario, en la aplicación Delphi, le pedirás que introduzca una contraseña.
2. Al guardar esta contraseña lo puedes hacer con algo como esto:
Código:
insert into usuarios values
(...., MD5(la_variable_con_la_constraseña), ....)
de esta forma en la base de datos, en la tabla "usuarios" se guardará el hash en MD5 de la contraseña, nunca la contraseña plana. Así, aunque se tenga acceso a la tabla de usuarios, nunca podrán saber la contraseña.
3. Para realizar la comprobación de si la contraseña introducida por el usuario es correcta (coincide con la de la base de datos), puesto que está en MD5, tendremos que hacer algo así para compararla:
Código:
select nick, contrasena, nombre
from usuarios
where MD5(la_variable_con_la_contraseña) = contrasena and
nick = la_variable_con_nick
de esta forma, esta consulta SQL sólo devolverá el registro si coincide el HASH en MD5 de la contraseña que ha introducido el usuario para el inicio de sesión con la que introdujo cuando se dio de alta.
Por supuesto existen más posibilidades, por ejemplo no utilizar la función MD5 de SQL de MySQL y hacerlo mediante código Delphi, así se consigue hacer independiente el código del motor de base de datos, para poder cambiar a otro motor (Oracle, SQL Server) sin problemas. Pues estos otros motores no tienen las mismas funciones SQL.
En Delphi existen componentes gratuitos para obtener el HASH en MD5 o SHA1, un ejemplo lo tienes en esta aplicación:
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A