En este artículo veremos como encriptar de forma más segura las contraseñas de los usuarios en nuestra base de datos.
Debemos encriptar las contraseñas de los usuarios para mantener – o tratar por lo menos – la seguridad de sus datos.
La gente tiene el hábito o mal hábito de usar la misma contraseña para todas sus cuentas, desde su cuenta en facebook hasta la de paypal o peor, la de su cuenta bancaria. Nuestra obligación es proteger ese dato fundamental por si desafortunadamente nuestra base de datos cae en las manos equivocadas, cómo las de un empleado mal intencionado o la de un hacker.
Las funciones hash md5() y sha1() hasta hace poco fueron un estándar, pero por la rapidez en la extracción de datos por fuerza bruta, dictionary o rainbow tables ya no se recomiendan para la codificación de contraseñas. El mismo creador de MD5 ha escrito en su blog que “la codificación md5() no es segura” y opten por algoritmos como SHA-2.
La función hash que utilizaremos será crypt() que soporta de forma nativa varios algoritmos. Por defecto usa la codificación MD5 pero por razones de seguridad usaremos Blowfish.
El algoritmo Blowfish está disponible a partir de la versión 5.3 de PHP. Si quieres comprobar que tienes soporte para Blowfish puedes colocar este código en un archivo PHP: Si podemos usar Blowfish pasaremos a codificar la contraseña, en el caso de que no, tendremos que instalar la última versión de PHP.
Como decía antes, la función hash que utilizaremos para codificar nuestra contraseña será crypt(). Por defecto, crypt() usaba el algoritmo DES aunque en las últimas versiones de PHP paso a MD5. Para forzar que crypt() utilice el algoritmo Blowfish debemos colocar un salt especial, si la función no reconoce el salt que escribimos, el hash resultante estará codificado en MD5.
El salt para Blowfish debe ser escrito de la siguiente manera: $2a$, $2x$ o $2y$ + 2 números de iteración entre 04 y 31 + 22 caracteres que pueden ser ./1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.
Ejemplo: $2x$07$./f4af7kJi1jdaxlswE34$
Para que nuestra contraseña sea más segura, vamos a crear una función que realice un salt aleatorio. El valor que se generará aleatoriamente para cada hash serán los últimos 22 caracteres. Para crear el hash con la función que recién creamos solamente tenemos que escribirlo de la siguiente manera
Cuando el usuario se registra se guarda en la base de datos su nombre de usuario y el hash asociado a su contraseña. Cuando éste va a loguearse completará el campo nombre de usuario y contraseña, si el hash de esta contraseña ingresada en el formulario de login coincide con el hash asociado al nombre de usuario guardado en la base de datos en el momento del registro, el usuario iniciará sesión.
Con la función crypt() reconocemos que el hash en la base de datos fue creado con Blowfish.
Salt en resumen sería una linea de texto que se añade – en este caso – a una contraseña para que sea más compleja de descifrar. Les dejo un ejemplo simple así les queda más gráfico: El resultado sería un hash que contiene el salt que creamos más la contraseña y eso es todo.
Más información
¿Para que debemos encriptar las contraseñas?
Debemos encriptar las contraseñas de los usuarios para mantener – o tratar por lo menos – la seguridad de sus datos.
La gente tiene el hábito o mal hábito de usar la misma contraseña para todas sus cuentas, desde su cuenta en facebook hasta la de paypal o peor, la de su cuenta bancaria. Nuestra obligación es proteger ese dato fundamental por si desafortunadamente nuestra base de datos cae en las manos equivocadas, cómo las de un empleado mal intencionado o la de un hacker.
Comencemos
Las funciones hash md5() y sha1() hasta hace poco fueron un estándar, pero por la rapidez en la extracción de datos por fuerza bruta, dictionary o rainbow tables ya no se recomiendan para la codificación de contraseñas. El mismo creador de MD5 ha escrito en su blog que “la codificación md5() no es segura” y opten por algoritmos como SHA-2.
La función hash que utilizaremos será crypt() que soporta de forma nativa varios algoritmos. Por defecto usa la codificación MD5 pero por razones de seguridad usaremos Blowfish.
Verificar si mi versión de PHP soporta Blowfish
El algoritmo Blowfish está disponible a partir de la versión 5.3 de PHP. Si quieres comprobar que tienes soporte para Blowfish puedes colocar este código en un archivo PHP: Si podemos usar Blowfish pasaremos a codificar la contraseña, en el caso de que no, tendremos que instalar la última versión de PHP.
Codificando la contraseña
Como decía antes, la función hash que utilizaremos para codificar nuestra contraseña será crypt(). Por defecto, crypt() usaba el algoritmo DES aunque en las últimas versiones de PHP paso a MD5. Para forzar que crypt() utilice el algoritmo Blowfish debemos colocar un salt especial, si la función no reconoce el salt que escribimos, el hash resultante estará codificado en MD5.
El salt para Blowfish debe ser escrito de la siguiente manera: $2a$, $2x$ o $2y$ + 2 números de iteración entre 04 y 31 + 22 caracteres que pueden ser ./1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.
Ejemplo: $2x$07$./f4af7kJi1jdaxlswE34$
Para que nuestra contraseña sea más segura, vamos a crear una función que realice un salt aleatorio. El valor que se generará aleatoriamente para cada hash serán los últimos 22 caracteres. Para crear el hash con la función que recién creamos solamente tenemos que escribirlo de la siguiente manera
Comprobar la contraseña
Cuando el usuario se registra se guarda en la base de datos su nombre de usuario y el hash asociado a su contraseña. Cuando éste va a loguearse completará el campo nombre de usuario y contraseña, si el hash de esta contraseña ingresada en el formulario de login coincide con el hash asociado al nombre de usuario guardado en la base de datos en el momento del registro, el usuario iniciará sesión.
Con la función crypt() reconocemos que el hash en la base de datos fue creado con Blowfish.
¿Qué es salt y para que sirve?
Salt en resumen sería una linea de texto que se añade – en este caso – a una contraseña para que sea más compleja de descifrar. Les dejo un ejemplo simple así les queda más gráfico: El resultado sería un hash que contiene el salt que creamos más la contraseña y eso es todo.
Más información