Las mejores formas para encriptar las claves.

Almacenar datos en los servidores sin la correcta seguridad pone en peligro la privacidad de los datos y puede ocasionar graves consecuencias legales. Estudiamos los métodos más profesionales.

protecciondatos
Fuente: agencialanave.com

Cuando almacenamos datos en nuestro servidor debemos estar preparados para cualquier tipo de acceso no autorizado para evitar disgustos innecesarios y tener sanciones de hasta 600000€ por no proteger la información sensible de los clientes.

Encriptar los datos consiste en grabarlos en la base de datos de forma codificada de forma que el hacker que consiga leer la base de datos no pueda entender su contenido. Se debe diferenciar entre encriptación con algoritmo reversible (que requiere obtener el dato original del almacenado) de un algoritmo de hash que solo codifica un contenido de forma única.

Empecemos primero por la encriptación sin inversa:

Por ejemplo las claves pueden almacenarse sin necesidad de reversibilidad de forma que si el cliente no conoce la clave no pueda entrar en nuestra web. Las funciones de PHP 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.

Si tenemos PHP 5.3 o superior dispondremos de algoritmos profesionales y podemos comprobarlo con el siguiente código que os será muy útil.

 <?php
if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
echo "Wiii, tengo CRYPT_BLOWFISH!";
}
?>

Para hacer más segura la creación de un HASH (un ID único para una cadena) se debe utilizar un SALT que se añade a la contraseña que debemos codificar para crear un elemento único que será guardado en la base de datos. Para comprobar si es valida la clave solo se aplicará el HASH y se comprobará si da el mismo resultado que el almacenado, así sabremos si es valida la clave.

Con este funcionamiento de la encriptación mediante HASH queda claro que cuando algún cliente desee recuperar la contraseña se deberá remitir un correo electrónico con un enlace para cambiar la contraseña y pedir la nueva. Nunca se podrá recibir la contraseña actual en el email.

$salt = '34a@$#aA9823$';
$password = 'agencialanave28625';
$password = hash('sha256', $salt . $password);

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 malintencionado o la de un hacker.

Uno de los algoritmos más adecuados es el BLOWFISH y para su utilización se debe emplear la función de PHP crypt. En función del SALT la función encriptará usando un sistema u otro.

Si el SALT se basa en un alfabeto de 22 caracteres dentro del array “set_salt” y se realiza el mismo mediante componentes aleatorios se obtendrá una encriptación de mayor calidad y mediante algoritmo BLOWFISH.

function crypt_blowfish_agencialanave($password, $digito = 7) {  
$set_salt = './1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';  
$salt = sprintf('$2a$%02d$', $digito);  
for($i = 0; $i < 22; $i++)  
{  
 $salt .= $set_salt[mt_rand(0, 63)];  
}  
return crypt($password, $salt);  
}

Una vez tenemos la función programada podremos comprobar si la clave es válida encriptando la misma indicando el valor conservado en la base de datos y comprobar si la función devuelve la propia cadena.  (el siguiente código lo ilustra)

$contrasenarecibidaporPOST= $_POST['password'];

$passwordenMYSQL = '$2a$07$yMoJrJpwEPrmVnZx4KIyNuOAiOMQksjkV1EW0YRgVe33eYe/yT60y';

if( crypt($contrasenarecibidaporPOST, $passwordenMYSQL) == $passwordenMYSQL) {
 echo 'Es igual, el usuario se ha loggeado. ';
}

Queda claro que para añadir una mayor seguridad al proyecto se deberá encriptar el propio código PHP mediante herramientas potentes de programación como las descritas en otro de nuestros artículos.

Ahora estudiaremos como encriptar los datos (siendo posible desencriptar): Por ejemplo cuando almacenamos en la BD la tarjeta de crédito para realizar pagos a posteriori. En este caso será indispensable que el código PHP también este encriptado para impedir al “hacker” sacar el dato origen al conocer el algoritmo.

En ese caso usaremos las funciones de PHP base64_encode, mcrypt_decrypt, y mcrypt_encrypt para guardar los datos en la base de datos de forma segura. Mediante una clase podremos establecer la CLAVE de encriptación.

class Encryptar {

    private static $Key = "agencialanave725518";

    public static function encrypt ($input) {
        $output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256
, md5(Encrypter::$Key), $input, MCRYPT_MODE_CBC, md5(md5(Encrypter
::$Key))));
        return $output;
    }

    public static function decrypt ($input) {
        $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 
md5(Encrypter::$Key), base64_decode($input), MCRYPT_MODE_CBC, 
md5(md5(Encrypter::$Key))), "\0");
        return $output;
    }

}

Si queremos ser estrictos o más seguros, la KEY empleada podría ser diferente según el usuario, algo que hacen plataformas como MEGA.co.nz y que permiten que los datos guardados en los servidores solo los pueda ver el propio usuario. Ni siquiera la propia empresa que aloja los archivos puede saber lo que se conserva.  (salvo que se guarden las claves enviadas por la red).

Para poder comprobar si la clave es la correcta os proponemos este sencillo código:

$texto = "La seguridad si es importante";

// Encriptamos el contenido
$texto_encriptado = Encryptar::encrypt($contenido);

// Desencriptamos el contenido
$texto_original = Encryptar::decrypt($texto_encriptado);

if ($texto == $texto_original) echo 'Encriptación = Desencriptación => son iguales.';

Queda claro que en toda esta seguridad se debe utilizar SSL para enviar las claves tecleadas por el usuario o incluso hacer un HASH a las mismas (SHA2) como advertimos en otro de nuestros artículos. (incluso en el propio cliente en JAVASCRIPT)

En AGENCIA LA NAVE no olvidamos estos puntos importantes del negocio para garantizar su éxito. Sabemos que los clientes quieren dormir tranquilos y lo que para algunos no es importante para nosotros lo es. No dude en consultarnos si necesita más información sin compromiso.

13 thoughts on “Las mejores formas para encriptar las claves.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *