Passwords Seguras

Muchas veces, al inyectar un sitio web nos topamos con passwords en texto plano: MD5 o SHA-1

Hay programadores -que quizás por ignorancia- no conocen este tipo de ataques y lo peligroso que pueden ser.

Además del SQLi, existen varias formas de poder obtener las credenciales del administrador de un sitio. Incluso si logran arrebatar la base de datos del mismo.

Algo que podemos hacer, es generar passwords seguras y en caso de que alguien logre obtener el hash, no pueda descifrarlo.

De esta forma, cada contraseña que generemos, será totalmente diferente a las demás y la única forma de averiguarla, será obteniendo el algoritmo para generarla.

Un hash es una cadena de texto que se logra aplicando un proceso matemático o algorítmico con la finalidad de transformar ese texto en una nueva cadena totalmente inentendible. Una vez obtenido este hash, es difícil volver al texto original sin conocer el proceso que se aplicó para obtenerlo.

MD5 y SHA-1 son uno de los tantos tipos de hashes que existen, el motivo por el cual los menciono, es porque son los más utilizados hoy en día. Lo malo de ellos, es que existen muchas formas de descifrarlos por fuerza bruta o diccionario, y de esta forma recuperar el texto plano.

Algunas reglas básicas para generar una constraseña segura pueden ser:

  • Usar siempre una semilla o salt.
  • La semilla debe ser los más aleatoria posible.
  • Utilizar una semilla diferente para cada password.
  • No almacenar la semilla en ninguna parte.

SALT.

La finalidad del salt es generar un string aleatorio y añadirselo al password. De esta forma, aumentará la longitud del password y también la complejidad para desencriptarlo.

El ataque de Rainbow Table (Tabla Arco Iris), solo funciona cuando las passwords han sido hasheadas con el mismo salt. Si usamos el mismo salt para todas las passwords correremos el riesgo de que puedan romperlas. Es por ello que lo aconsejable es crear un salt distinto para cada password.

Para generar salts aleatoreos en PHP, lo mejor es usar las funciónes mcrypt_create_iv o openssl_random_pseudo_bytes

A continuación un ejemplo de su uso:

<?php

$user = $_POST[‘user’];

$pass = $_POST[‘pass’];

$salt = str_replace(‘=’, ‘.’, base64_encode(mcrypt_create_iv(20)));

$hash = hash_hmac(‘SHA512’, $pass, $salt);

var_dump($hash);

?>

Básicamente lo que hace el código es recibir una password por POST, luego generamos un salt y lo unimos a la contraseña del usuario y finalmente lo encriptamos con SHA512

Con esto podemos tener una password “Segura”. Lo remarco con comillas, ya que pienso que la seguridad es un mito. No existe nada que sea 100% seguro.

A pesar de tener este nuevo hash difícil de crackear, hoy en día existen máquinas que se usan únicamente para romper contraseñas, por lo que podemos hacer esta tarea un poco más difícil añadiendole una iteración al código.

<?php

function hash_password($password, $salt)

{

    $hash = hash_hmac(‘SHA512’, $pass, $salt);

    for ($i = 0; $i < 5000; $i++)

    {

       $hash = hash_hmac(‘SHA512’, $hash, $salt);

    }   

    return $hash;

}

$user = $_POST[‘user’];

$pass = $_POST[‘pass’];

$salt = str_replace(‘=’, ‘.’, base64_encode(mcrypt_create_iv(20)));

$hash = hash_password($pass, $salt);

var_dump($hash);

?>

Como se puede ver en el código, estas 5.000 iteraciones vuelve un poco más seguro y difícil de crackear.

Con estos algoritmos, podremos tener un nivel medio de seguridad a la hora de guardar nuestras contraseñas y en caso de que alguien obtenga algún hash, no podrá descifrarlo fácilmente.

Leave a Comment