[PHP] Encriptar Contraseñas

on miércoles, 3 de julio de 2013
Bueno en este tema se vera como encriptar las contraseñas de nuestros usuarios de forma mas segura en nuestra base de datos.

¿Porque debemos hacer esto?

Esto lo hacemos con fines de proteger su información por si alguna persona con fines de explotar o robar información no pueda acceder a ella, ya que en muchas ocasiones los usuarios llegan a usar la misma contraseña para todo y eso pues esta mal entonces nuestro deber es poder proteger lo mas posible esos datos importantes y que solo el usuario pueda saber sobre y ni siquiera nosotros podramos saber así pues tener un poquito mas segura su información.




--------------

Ahora si iniciando,
muchas veces nosotros llegamos a usar la encriptacion md5 lo cual en un principio estaba bien, pero hoy en día esta ya no es segura ya que hay diferentes métodos para obtener el dato encriptado y paginas pues que tienen una gran cantidad de palabras con su encriptacion lo cual hace mucho mas rápido la obtención del dato ...

En este caso nosotros usaremos la función crypt y el algoritmo blowfish el cual esta disponible desde la versión 5.3 de PHP, y hoy en día la mayoría de Hosts ya tienen esta versión, por lo que no debería ser un problema :P

Bueno primeramente la función crypt recibe como parámetro 2 datos
crypt(contraseña, salt)
donde el salt es un salt de nuestro algoritmo el cual sino es reconocido se usara el de por defecto que es MD5.

Un salt para Blowfish consta de lo siguiente:

  • Usar alguno de los siguientes $2a$$2x$ o $2y$
  • En conjunto de $numero$ , donde numero es un numero entre 04 y 31
  • 22 Caracteres

Un Ejemplo seria:
$2x$$08$1h6k1mGtLp9y5vFtBnUfX10

Ahí mostramos como quedaría nuestro salt, pero esto para hacer un poco mas seguro y bonito, podemos crear una función como la siguiente:


function cifrar($contrasena, $numero = 8)
{
    $salt = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./';
    $saltc = sprintf('$2x$%02d$', $numero);
    for($i = 0; $i < 22; $i++)
        $saltc .= $salt[ rand(0, strlen($salt)-1) ];
    return crypt($contrasena, $saltc);
}

Listo ahora ya podemos llamar a nuestra función y nos regresara nuestra contraseña encriptada,
ahora lo que nos falta es saber como comprobarla ...

Podemos hacer uso de la siguiente función:


function descifrar($contrasena, $cifrada)
{
    if(crypt($contrasena, $cifrada) == $cifrada)
        return true;
    return false;
}

Listo ahora ya podemos hacer uso de ella, para un registro bastaría sacar el hash con la función cifrar y guardar ese cifrado como su contraseña en la Base de Datos, y ahora a la hora de loguearse, hacemos búsqueda de su usuario y obtenernos los datos de contraseña y ahora hacemos uso de la función descifrar, enviándole la contraseña que coloco y la contraseña que se haya obtenido de la consulta(si es que se encontró, sino pues es "Error el Usuario No Existe") y ya si regresa true significa que si logro entrar en caso contrario pues que no.

Aquí un ejemplo sencillo:

function encriptar($contrasena, $numero = 8)
{
    $salt = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./';
    $saltc = sprintf('$2y$%02d$', $numero);
    for($i = 0; $i < 22; $i++)
        $saltc .= $salt[ rand(0, strlen($salt)-1) ];
    
    return crypt($contrasena, $saltc);
}

function descifrar($contrasena, $cifrada)
{
    if(crypt($contrasena, $cifrada) == $cifrada)
        return true;
    return false;
}

$contrasena = 'MiContraseña';
$cifrada = encriptar($contrasena);
$descifrada = (descifrar($contrasena, $cifrada) ? 'Si' : 'No');

echo 'Contraseña: ' . $contrasena ;
echo 'Encriptada: ' . $cifrada ;
echo 'Es igual: ' . $descifrada ;

Bueno eso seria todo, esta para mi es la que uso actualmente en mis proyectos para el cifrado de información y no solo para contraseñas sino para cualquier dato importante que pueda afectar al cliente o usuario.

Saludos*! y suerte!

3 comentarios:

Blogger CR dijo...

Como hago para hacer login y comparar las claves ? la que escribo con la que está guardada en la base de datos ????

Blogger CR dijo...

???

Victor soork dijo...

Cuando registres al usuario guarda su contraseña encriptada usando la funcion encriptar, luego cuando quieras loguearlo, puedes usar esta funcion:


function descifrar($contrasena)
{
$cifrada = encriptar($contrasena);
if(crypt($contrasena, $cifrada) == $cifrada)
return true;
return false;
}

Entonces ya con eso puedes usar esa cifrada, y esa ya la usas en la consulta para checar su login o verificar sus datos.


Publicar un comentario