Si tienes una cuenta en LinkedIn es mejor que te apresures a cambiar tu contraseña ya que puede encontrarse en la lista de contraseñas cifradas que un internauta ruso asegura en un foro haber obtenido de forma ilegal. El sitio The Verge ha publicado la noticia, además han consultado con Mikko Hypponen quien trabaja como Jefe de la Oficina de Investigación en F-Secure empresa dedicada a la seguridad informática, quien piensa que la lista es real y que pudo haber sido obtenida explotando alguna vulnerabilidad de la interfaz web del sitio, sin embargo por el momento es imposible determinar el origen real de dicha lista.
LinkedIn es una red social para profesionales que cuenta con más de 150 millones de participantes, en el pasado se ha visto afectada por problemas de spam (correos y mensajes no solicitados), sus usuarios e incluso personas que no se encuentran inscritas en el sitio se han quejado de mensajes abusivos con fines comerciales generados por personas inscritas en la red.
La lista contiene cerca de 6 millones 200 mil (6.143.150) de contraseñas cifradas en SHA-1 que es un algoritmo de cifrado que se creía resistente a todos los ataques hace algunos años. Uno de aspectos que llama la atención del fichero que contiene los registros es que algunos comienzan con una cadena de cinco ceros (00000) lo que algunos internautas se han atrevido a asegurar que se trata trazas cuyas contraseñas han sido descubiertas, entre dichas contraseñas se encuentran “linkedin“, “password“, “secret” en las cuales sus respectivas trazas comienzan con cinco ceros.
Cabe destacar que no todas las trazas de contraseñas han sido robadas y para aclarar a quienes aún puedan tener confusión, el archivo contiene solo contraseñas cifradas utilizando el algoritmo SHA-1, no contiene nombres de usuario o cualquier otro dato que pueda identificar a los usuarios afectados. Sin embargo, es sabido que en el mundo de los crackers y hackers de gorra negra los archivos de trazas son bastante útiles puesto que se pueden analizar usando ataques de diccionario y comparar con listas de trazas descifradas.
Muchos desarrolladores web utilizan algoritmos de cifrado si se quiere débiles, creyendo así que están agregando una capa de seguridad a sus aplicaciones, sin embargo esto no es así. Uno de los algoritmos de cifrado que aún sigue siendo utilizado por desarrolladores web es el MD5 no obstante este algoritmo no es para nada seguro y está comprobada su debilidad ante ataques de fuerza bruta.
¿Entonces, cómo proteger las contraseñas?
Sin duda alguna este es un tema bastante difícil de tratar, distintas empresas y desarrolladores han utilizado técnicas de cifrado combinadas para tratar de minimizar el impacto que pueda tener un evento como el que acaba de ocurrir a LinkedIn. A mí particularmente me agrada el cifrado combinado con doble llave similar al empleado por WordPress para cifrar las contraseñas de los usuarios.
¿Me podrías mostrar cómo se hace?
Yo utilizo algunas particularidades en mis funciones de cifrado de contraseñas, a continuación te mostraré mi forma de hacerlas más seguras:
1.- Primero creo un certificado que será mi llave de cifrado, similar al empleado para firmar certificados digitales en los servidores web, para ello uso SSH RSA:
ssh-keygen -b 4048 -t rsa
El fichero con la llave privada generado (llamado por defecto id_rsa) me servirá de base para cifrar las contraseñas.
2.- Luego a este fichero le asigno un nombre, lo guardo en la raíz de mi aplicación y le restrinjo los permisos de acceso de manera que solo el administrador tenga acceso a el. Posteriormente accedo a él desde mi aplicación:
private function llave_privada() {
$llave = file_get_contents( RAIZ . 'mi_llave.txt' );
return $llave;
}
3.- Después creo una traza aleatoria para añadir a cada contraseña creada por el usuario o por el propio sistema:
public function nueva_traza() {
// Traza aleatoria
$long = 32;
$cars = '%&#ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890=°_-/\£';
// Longitud de la lista de caracteres
$long_cars = (strlen($cars) - 1);
// Comenzar la cadena
$cadena = $cars{rand(0, $long_cars)};
// Generar una cadena aleatoria
for ($i = 1; $i < $long; $i = strlen($cadena)) {
// Tomar un caracter al azar
$car_alea = $cars{rand(0, $long_cars)};
// Asegurarse que el mismo caracter no aparece dos veces uno al lado del otro
if ($car_alea != $cadena{$i - 1}) $cadena .= $car_alea;
}
// Generar la traza
$traza = mt_rand() . $cadena;
return $traza;
}
4.- Una vez tengo los elementos necesarios, los uno a la contraseña del usuario:
public function cifrar_contra( $contrasena ) {
$traza = $this->nueva_traza();
$llave = $this->llave_privada();
$cifrar_contra = hash_hmac("sha256", $contrasena . $traza, $llave);
$traza_contra = array(
'contra' => $cifrar_contra,
'traza' => $traza
);
return $traza_contra;
}
5.- Y finalmente cada vez que un usuario vaya a iniciar sesión cifro la contraseña independientemente y luego verifico que la traza resultante sea igual a la traza generada la primera vez.
Este método tiene la ventaja de que dos contraseñas iguales no obtendrán como resultado la misma traza, por ende aunque se descubra la palabra oculta tras una de las trazas no aplicará para todas las contraseñas iguales a la descubierta.
¿Ya estás usando técnicas avanzadas para asegurar las contraseñas de tus usuarios? No olvides comentar y compartir, Gracias!




